POSTリモートのJSONコンテンツRESTエンドポイントにしようとしていますが、配信時に 'content'の値が空のようです。他のすべてのヘッダーなどは正しく受信され、ブラウザベースのテストクライアントでWebサービスが正常にテストされます。
'content'フィールドを指定する以下の構文に問題がありますか?
$data = array("username" => "duser", "firstname" => "Demo", "surname" => "User", "email" => "[email protected]");
$data_string = json_encode($data);
$result = file_get_contents('http://test.com/api/user/create', null, stream_context_create(array(
'http' => array(
'method' => 'POST',
'header' => array('Content-Type: application/json'."\r\n"
. 'Authorization: username:key'."\r\n"
. 'Content-Length: ' . strlen($data_string) . "\r\n"),
'content' => $data_string)
)
));
echo $result;
これは私がいつも使用するコードで、かなり似ています(もちろん、これはx-www-form-urlencodedの場合です)。おそらく、username:key
をbase64_encode
にする必要があります。
function file_post_contents($url, $data, $username = null, $password = null)
{
$postdata = http_build_query($data);
$opts = array('http' =>
array(
'method' => 'POST',
'header' => 'Content-type: application/x-www-form-urlencoded',
'content' => $postdata
)
);
if($username && $password)
{
$opts['http']['header'] = ("Authorization: Basic " . base64_encode("$username:$password"));
}
$context = stream_context_create($opts);
return file_get_contents($url, false, $context);
}
の初期の反応
function file_post_contents($url, $data, $username = null, $password = null) {
$postdata = http_build_query($data);
$opts = array('http' =>
array(
'method' => 'POST',
'header' => 'Content-type: application/x-www-form-urlencoded',
'content' => $postdata
)
);
if($username && $password)
{
$opts['http']['header'] = ("Authorization: Basic " . base64_encode("$username:$password"));
}
$context = stream_context_create($opts);
return file_get_contents($url, false, $context);}
間違っている。この関数は時々機能しますが、application/x-www-form-urlencodedのContent-typeを使用せず、ユーザー名とパスワードを渡した場合、不正確で失敗します。
Application/x-www-form-urlencodedがデフォルトのContent-typeであるため、ライターにとっては機能しますが、ユーザー名とパスワードの処理により、以前のコンテンツタイプの宣言が上書きされます。
修正された関数は次のとおりです。
function file_post_contents($url, $data, $username = null, $password = null){
$postdata = http_build_query($data);
$opts = array('http' =>
array(
'method' => 'POST',
'header' => "Content-type: application/x-www-form-urlencoded\r\n",
'content' => $postdata
)
);
if($username && $password)
{
$opts['http']['header'] .= ("Authorization: Basic " . base64_encode("$username:$password")); // .= to append to the header array element
}
$context = stream_context_create($opts);
return file_get_contents($url, false, $context);}
次の行に注意してください:$ opts ['http'] ['header'。=(ドットは配列要素に追加することと同じです。)