PHP流post请求不起作用,但可与curl一起使用

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

我想以php流的形式发送post请求

$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
    )
);