PHPでRESTAPIを作成中。「curl_setopt」を使っているのですが、、、、
解決済
回答 1
投稿
- 評価
- クリップ 0
- VIEW 1,444
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);
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
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();
- composer installでインストール
- php client.phpで実行
参考までにLaravelでのルータの受け口
Route::post('server', function (\Illuminate\Http\Request $request) {
return $request->input("field1")."a";
});
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.23%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2017/08/17 19:11
試しているのですが、まだできていないのですが、
これはホストのポートを9998と9999で分けているのは
必須でしょうか?
同じホスト(ポート未指定)で試しているのですが、ファイルに書き込まれないです。
2017/08/17 19:15 編集
ファイルに書き込まれないのはファイル権限等の別の問題かもしれません。
以下でファイルが書き込まれるか試してみると良いかと思います。
```
$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)
2017/08/18 12:21
おそらく権限の問題でした。
次にそのdump.txtの中を見ると
Array
(
[{"field1":"aaa","field2":"123"}] =>
)
Array
(
[{"field1":"aaa","field2":"123"}] =>
)
のように2回ずつ書き込まれる上に、
なぜか配列のキーの部分にjsonが入っていて
値は空という
奇妙な形になっているのですが、
これはなぜでしょうか?
2017/08/18 12:32
ログが変なのはvar_dumpの結果を出力バッファリング制御でob_get_contentsで強引に取得しているからで、普通にfputs($fp, json_encode($_POST))みたいにすると良いかと思います。
2017/08/18 12:46
諸所工夫して、シンプルな以下の形まで持っていけました。
{"field1":"aaa","field2":"123"}
ここからPHP上でファイルの中身を出力させたく
以下のように記載しても何も表示されませんでした。
やはりcurlで処理している以上難しいのでしょうか。
ログで処理するのは難しいのではと思ったので。。
...省略
fclose($fp);
$lines = file("./dump.txt");
foreach ($lines as $line){
echo $line;
}
2017/08/18 12:56 編集
2017/08/18 14:07
client.phpからpostでserver.phpに「test」という文字列を
送るとすると、それに「a」を付加して「testa」という文字列を
client.phpに返すとすると、server.phpでどんな処理が必要か
わからないのです。今、dump.txtにtestという文字列を出力
するところまでできていますが、その先がわかりません。
いったん、dump.txtから文字列を出力というか取り出し
できればaを付加できるかなと思って聞きました。
2017/08/18 14:36 編集
LaravelやCakePHP等のWebフレームワークを使ってサーバー側を作って、それにGuzzleなどでアクセスしたほうがいいと思います。
一応clientはGuzzleで、serverはLaravelで簡単に、field1のpostデータにaを追加するものを回答にサンプルで記載してみたので、Laravelを使ってみるか好みの別のフレームワーク等で試してみてください。
2017/08/18 15:11
大変助かりました(^^)/