質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
REST

REST(Representational State Transfer)はwebアプリケーションの構築スタイルの一種です。HTTP GET/POSTによってリクエストを送信し、レスポンスはXMLで返されます。SOAPのようなRPCの構築と比べるとサーバからクライアントを分離することが出来る為、人気です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

1回答

513閲覧

PHPでRESTAPIを作成中。「curl_setopt」を使っているのですが、、、、

firegrape

総合スコア902

REST

REST(Representational State Transfer)はwebアプリケーションの構築スタイルの一種です。HTTP GET/POSTによってリクエストを送信し、レスポンスはXMLで返されます。SOAPのようなRPCの構築と比べるとサーバからクライアントを分離することが出来る為、人気です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2017/08/17 07:58

phpの関数curl_setoptを使ってPOST送信させ、APIのようなものを作る予定です。
以下の$tmpを出力すれば値は帰ってくるのですが、本来APIなので、送信先で処理をした値を返したいです。
そこで送信先のコントローラまでは処理は来ているのですが、送信先のコントローラで以下のように出力しようとしても
何も表示されません。
var_dump($_POST);
解決策はありますでしょうか?

define("API_URL", "http://xxx.xxx.xxx.xxx/post"); $json_data = json_encode($data); $options = array( CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => true, CURLOPT_AUTOREFERER => true, ); $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, API_URL); // 収集したパラメータ付与 curl_setopt($curl, CURLOPT_POST, true); curl_setopt($curl, CURLOPT_POSTFIELDS, $json_data); curl_setopt($curl, CURLOPT_COOKIE, $_SERVER['HTTP_COOKIE']); // ★cookie情報 curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); // 文字列で返却 curl_setopt_array($curl, $options); $tmp = curl_exec($curl); curl_close($curl);

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

プログラムを検証してみました。
結論として送信先(下記検証プログラムでserver.php)でvar_dumpの出力を扱いたい時は出力をバッファリングしてログに書き込めばできます。
(そもそもvar_dumpせずにそのままログにデータを書き込む方がよいかと思います)

以下簡単な検証プログラムです。

client.php
php -S localhost:9998で起動

<?php define("API_URL", "http://localhost:9999/server.php"); $data = array("field1" => "aaa", "field2" => "123"); $json_data = json_encode($data); $options = array( CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => true, CURLOPT_AUTOREFERER => true, ); $curl = curl_init(API_URL); curl_setopt($curl, CURLOPT_POST, true); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_POSTFIELDS, $json_data); curl_setopt($curl, CURLOPT_COOKIE, $_SERVER['HTTP_COOKIE']); curl_setopt_array($curl, $options); $result = curl_exec($curl); curl_close($curl); echo $result;

server.php
php -S localhost:9999で起動

<?php ob_start(); var_dump($_POST); $result =ob_get_contents(); ob_end_clean(); $fp = fopen("./dump.txt", "a+" ); fputs($fp, $result); fclose( $fp ); //追記:ローカルサーバーのコンソールに出力 $stdout= fopen( 'php://stdout', 'w' ); fputs( $stdout, json_encode($_POST)); fclose( $stdout );

ブラウザでhttp://localhost:9998/client.phpにアクセスし、client.phpからserver.phpへのcurlでの通信を実行
dump.txtにvar_dump結果の保存を確認

###追記 Guzzleを使ったclient.php
composer.json

{ "require": { "guzzlehttp/guzzle": "^6.3" } }

client.php

<?php require 'vendor/autoload.php'; $client = new \GuzzleHttp\Client(); $res = $client->request('POST', 'http://localhost:9999/server',[ 'form_params' => [ "field1"=>"test" ], ]); echo $res->getBody(); echo $res->getStatusCode();
  1. composer installでインストール
  2. php client.phpで実行

参考までにLaravelでのルータの受け口

Route::post('server', function (\Illuminate\Http\Request $request) { return $request->input("field1")."a"; });

投稿2017/08/17 09:46

編集2017/08/18 05:44
aro10

総合スコア4106

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

firegrape

2017/08/17 10:11

ご回答ありがとうございます! 試しているのですが、まだできていないのですが、 これはホストのポートを9998と9999で分けているのは 必須でしょうか? 同じホスト(ポート未指定)で試しているのですが、ファイルに書き込まれないです。
aro10

2017/08/17 11:14 編集

別々のサーバーを想定して2つにわけてみました。 ファイルに書き込まれないのはファイル権限等の別の問題かもしれません。 以下でファイルが書き込まれるか試してみると良いかと思います。 ``` $fp = fopen("./dump.txt", "a+" ); fputs($fp, "test"); fclose( $fp ); ``` あと、PHPでcurlを使う場合は、定番ライブラリとしてGuzzleというものがあるので利用を検討してみてください。 [Guzzle Documentation](http://docs.guzzlephp.org/en/stable/) [今時のPHP HTTPクライアントのGuzzleを使ってみた](http://qiita.com/yousan/items/2a4d9eac82c77be8ba8b)
firegrape

2017/08/18 03:21

dump.txtの置き場所を変更したら、書き込まれるようになりました。 おそらく権限の問題でした。 次にそのdump.txtの中を見ると Array ( [{"field1":"aaa","field2":"123"}] => ) Array ( [{"field1":"aaa","field2":"123"}] => ) のように2回ずつ書き込まれる上に、 なぜか配列のキーの部分にjsonが入っていて 値は空という 奇妙な形になっているのですが、 これはなぜでしょうか?
aro10

2017/08/18 03:32

2回書き込まれているのはサンプルではファイル書き込みがa+の追記型なので、2回処理が走ったからだと思います。 ログが変なのはvar_dumpの結果を出力バッファリング制御でob_get_contentsで強引に取得しているからで、普通にfputs($fp, json_encode($_POST))みたいにすると良いかと思います。
firegrape

2017/08/18 03:46

ありがとうございます! 諸所工夫して、シンプルな以下の形まで持っていけました。 {"field1":"aaa","field2":"123"} ここからPHP上でファイルの中身を出力させたく 以下のように記載しても何も表示されませんでした。 やはりcurlで処理している以上難しいのでしょうか。 ログで処理するのは難しいのではと思ったので。。 ...省略 fclose($fp); $lines = file("./dump.txt"); foreach ($lines as $line){ echo $line; }
aro10

2017/08/18 04:00 編集

サンプルを例としてコントローラ(server.php)でそのままechoをすると、client.phpへのレスポンスに対して書き込まれるので、php -S localhost:9999で起動したサーバーのコンソールで内容を確認したいという意図であればphp://stdoutの標準出力を書き込み先にしたコードを回答に追記してみました
firegrape

2017/08/18 05:07

あ、聞き方が悪かったです、すみません。 client.phpからpostでserver.phpに「test」という文字列を 送るとすると、それに「a」を付加して「testa」という文字列を client.phpに返すとすると、server.phpでどんな処理が必要か わからないのです。今、dump.txtにtestという文字列を出力 するところまでできていますが、その先がわかりません。 いったん、dump.txtから文字列を出力というか取り出し できればaを付加できるかなと思って聞きました。
aro10

2017/08/18 05:43 編集

そうなるとサーバー側で色々とまともな処理を整えるコードを書くのはコード量が大きくなるので、 LaravelやCakePHP等のWebフレームワークを使ってサーバー側を作って、それにGuzzleなどでアクセスしたほうがいいと思います。 一応clientはGuzzleで、serverはLaravelで簡単に、field1のpostデータにaを追加するものを回答にサンプルで記載してみたので、Laravelを使ってみるか好みの別のフレームワーク等で試してみてください。
firegrape

2017/08/18 06:11

ありがとうございます、参考にいたします。 大変助かりました(^^)/
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問