PHP流post请求不起作用,但可与curl一起使用
我想以php流的形式发送post请求PHP流post请求不起作用,但可与curl一起使用,php,curl,stream,Php,Curl,Stream,我想以php流的形式发送post请求 $aruguments = http_build_query( array( 'apikey' => 'xxxxxxxxxxxxxxxxxxxxxxxx', 'appid' => 730, 'min' => 20, 'items_per_page' => 100 ) ); $opts_stream = array('http' => arr
$aruguments = http_build_query(
array(
'apikey' => 'xxxxxxxxxxxxxxxxxxxxxxxx',
'appid' => 730,
'min' => 20,
'items_per_page' => 100
)
);
$opts_stream = array('http' =>
array(
'method' => 'POST',
'header' => 'Content-Type: application/json' .
'x-requested-with: XMLHttpRequest',
'content' => $aruguments
)
);
$context_stream = stream_context_create($opts_stream);
$json_stream = file_get_contents('https://api.example.de/Search', false, $context_stream);
$data_stream = json_decode($json_stream, TRUE);
出于某种原因,我会说:
无法打开流:HTTP请求失败!HTTP/1.1 403禁止
如果我用cUrl发送相同的请求,它工作正常,但速度非常慢
这是我的cUrl请求,它有效
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://api.example.de/Search');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, "{ \"apikey\": \"xxxxxxxxxxxxxxxxxxxxxxxxxxxx\",\"min\": 20, \"appid\": 730, \"items_per_page\": $number_of_items_per_request }");
curl_setopt($ch, CURLOPT_POST, 1);
$headers = array();
$headers[] = 'Accept: application/json';
$headers[] = 'Content-Type: application/json';
$headers[] = 'X-Requested-With: XMLHttpRequest';
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$result = curl_exec($ch);
curl_close ($ch);
发布的代码有几个问题 标题 添加标题时,可以在一个字符串中设置所有标题。为了让目标服务器知道一个标头何时结束,另一个标头何时开始,您需要使用新行(
\r\n
)将它们分开:
发布数据
流上下文和cURL代码之间的最大区别在于,cURL代码以json格式发布数据,而流上下文以x-www-form-urlencoded字符串发布数据。但是,您仍然在告诉服务器内容是json,所以我猜服务器有点困惑
通过更改以下内容将数据发布为json:
$aruguments = http_build_query(
array(
'apikey' => 'xxxxxxxxxxxxxxxxxxxxxxxx',
'appid' => 730,
'min' => 20,
'items_per_page' => 100
)
);
到
你能给我们看一下cURL代码吗?这有助于我们获得一个有效请求的引用。此外,您需要为标题添加换行符。每个标头都需要位于自己的行上:
“标头”=>“内容类型:application/json\r\n”。“foo:bar\r\n”
。还请注意双引号(或\r\n
将被读取为文本而不是新行)。@MagnusEriksson如果我这样发送,我会收到错误400,那么我不确定您是否正确实现了它。但是,您也以错误的格式发送数据。您的cURL代码以json的形式发送post数据,而您的第一次尝试(不起作用)是以x-www-form-urlencoded字符串的形式发布数据。尝试将$arguments=http\u build\u query(…)
更改为$arguments=json\u encode(…)
并进行测试。@MagnusEriksson当我对其进行编码并使用换行符和双引号时,它会起作用。谢谢
$aruguments = http_build_query(
array(
'apikey' => 'xxxxxxxxxxxxxxxxxxxxxxxx',
'appid' => 730,
'min' => 20,
'items_per_page' => 100
)
);
$aruguments = json_encode(
array(
'apikey' => 'xxxxxxxxxxxxxxxxxxxxxxxx',
'appid' => 730,
'min' => 20,
'items_per_page' => 100
)
);