web-dev-qa-db-ja.com

POSTを使用したJSON PHPの読み取り

私はこの質問を投稿する前によく見て回ったので、別の投稿にある場合は謝罪し、これはここでの2番目の質問ですので、この質問を正しくフォーマットしない場合はおologiesびします。

ポスト値を取得し、JSONエンコードされた配列を返す必要がある、作成した非常にシンプルなWebサービスがあります。 content-typeのapplication/jsonでフォームデータを投稿する必要があると言われるまで、すべてうまくいきました。それ以来、私はWebサービスから値を返すことができず、それらの投稿値をフィルタリングする方法に関係しています。

基本的にローカル設定では、次のことを行うテストページを作成しました-

$curl = curl_init();
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "POST");                                                                     
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);                                                                  
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);                                                                      
curl_setopt($curl, CURLOPT_HTTPHEADER, array(                                                                          
    'Content-Type: application/json',                                                                                
    'Content-Length: ' . strlen($data))                                                                       
);
curl_setopt($curl, CURLOPT_URL, 'http://webservice.local/');  // Set the url path we want to call
$result = curl_exec($curl);

//see the results
$json=json_decode($result,true);
curl_close($curl);
print_r($json);

Webサービスではこれがあります(いくつかの機能を削除しました)-

<?php

header('Content-type: application/json');

/* connect to the db */
$link = mysql_connect('localhost','root','root') or die('Cannot connect to the DB');
mysql_select_db('webservice',$link) or die('Cannot select the DB');

if(isset($_POST['action']) && $_POST['action'] == 'login') {
    $statusCode = array('statusCode'=>1, 'statusDescription'=>'Login Process - Fail');
    $posts[] = array('status'=>$statusCode);
    header('Content-type: application/json');
    echo json_encode($posts);

    /* disconnect from the db */
}
@mysql_close($link);

?>

基本的に、$ _ POSTの値が設定されていないことが原因であることはわかっていますが、$ _ POSTの代わりに置く必要があるものが見つかりません。私はjson_decode($ _ POST)、file_get_contents( "php:// input")および他のいくつかの方法を試しましたが、暗闇で少し撮影していました。

どんな助けも大歓迎です。

ありがとう、スティーブ

助けてくれたマイケルに感謝します。それは明確な前進でした。今では、投稿をエコーすると少なくとも回答が得られます。

更新されたCURL-

  $curl = curl_init();
  curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Type: application/json')); 
  curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST"); 
  curl_setopt($curl, CURLOPT_URL, 'http://webservice.local/');  
  curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data));

データが投稿されているページの更新されたphp-

$inputJSON = file_get_contents('php://input');
$input= json_decode( $inputJSON, TRUE ); //convert JSON into array

print_r(json_encode($input));

少なくとも私が言うように、今では空白ページを返す前に応答が表示されます

55
Steve Matthews

空の$_POSTがあります。 Webサーバーでjson形式のデータを表示する場合は、生の入力を読み取り、JSONデコードで解析する必要があります。

そのようなものが必要です:

$json = file_get_contents('php://input');
$obj = json_decode($json);

JSON通信をテストするための間違ったコードもあります...

CURLOPT_POSTFIELDSは、パラメーターをapplication/x-www-form-urlencodedとしてエンコードするようcurlに指示します。ここにはJSON文字列が必要です。

UPDATE

テストページのphpコードは次のようになります。

$data_string = json_encode($data);

$ch = curl_init('http://webservice.local/');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
        'Content-Type: application/json',
        'Content-Length: ' . strlen($data_string))
);

$result = curl_exec($ch);
$result = json_decode($result);
var_dump($result);

また、Webサービスページで、header('Content-type: application/json');行の1つを削除する必要があります。一度だけ呼び出す必要があります。

122

こんにちは、これはcurlを使用してjson形式で応答するいくつかの無料のipデータベースサービスからip情報を取得する私の古いプロジェクトのスニペットです。役立つと思います。

$ip_srv = array("http://freegeoip.net/json/$this->ip","http://smart-ip.net/geoip-json/$this->ip");

getUserLocation($ip_srv);

関数:

function getUserLocation($services) {

        $ctx = stream_context_create(array('http' => array('timeout' => 15))); // 15 seconds timeout

        for ($i = 0; $i < count($services); $i++) {

            // Configuring curl options
            $options = array (
                CURLOPT_RETURNTRANSFER => true, // return web page
                //CURLOPT_HEADER => false, // don't return headers
                CURLOPT_HTTPHEADER => array('Content-type: application/json'),
                CURLOPT_FOLLOWLOCATION => true, // follow redirects
                CURLOPT_ENCODING => "", // handle compressed
                CURLOPT_USERAGENT => "test", // who am i
                CURLOPT_AUTOREFERER => true, // set referer on redirect
                CURLOPT_CONNECTTIMEOUT => 5, // timeout on connect
                CURLOPT_TIMEOUT => 5, // timeout on response
                CURLOPT_MAXREDIRS => 10 // stop after 10 redirects
            ); 

            // Initializing curl
            $ch = curl_init($services[$i]);
            curl_setopt_array ( $ch, $options );

            $content = curl_exec ( $ch );
            $err = curl_errno ( $ch );
            $errmsg = curl_error ( $ch );
            $header = curl_getinfo ( $ch );
            $httpCode = curl_getinfo ( $ch, CURLINFO_HTTP_CODE );

            curl_close ( $ch );

            //echo 'service: ' . $services[$i] . '</br>';
            //echo 'err: '.$err.'</br>';
            //echo 'errmsg: '.$errmsg.'</br>';
            //echo 'httpCode: '.$httpCode.'</br>';
            //print_r($header);
            //print_r(json_decode($content, true));

            if ($err == 0 && $httpCode == 200 && $header['download_content_length'] > 0) {

                return json_decode($content, true);

            } 

        }
    }
1
Sastidar

jsonのみをヘッダーに入れる代わりに、jsonをパラメーターに入れて送信することができます。

$post_string= 'json_param=' . json_encode($data);

//open connection
$ch = curl_init();

//set the url, number of POST vars, POST data
curl_setopt($ch,CURLOPT_POST, 1);
curl_setopt($ch,CURLOPT_POSTFIELDS, $post_string);
curl_setopt($curl, CURLOPT_URL, 'http://webservice.local/');  // Set the url path we want to call

//execute post
$result = curl_exec($curl);

//see the results
$json=json_decode($result,true);
curl_close($curl);
print_r($json);

サービス側では、json文字列をパラメーターとして取得できます。

$json_string = $_POST['json_param'];
$obj = json_decode($json_string);

その後、変換されたデータをオブジェクトとして使用できます。

0