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

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

ただいまの
回答率

90.38%

  • PHP

    25048questions

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

  • API

    1890questions

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

  • REST

    169questions

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

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

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 742

uezatty

score 10

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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

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();
  1. composer installでインストール
  2. php client.phpで実行

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 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

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

    キャンセル

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

  • ただいまの回答率 90.38%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • PHP

    25048questions

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

  • API

    1890questions

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

  • REST

    169questions

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