为什么我的 POST file_get_contents 返回 HTTP 错误请求?

Why is my POST file_get_contents returning HTTP Bad Request?

这是我的代码:

$url = 'http://99.99.99.999:12480/rs/AuthorizationSession';
$credentials = 'admin:system';
$base64 = base64_encode($credentials);

// Set header text.
$header =   "Content-type: application/json\r\n" .
            "Accept: application/json\r\n" .
            "RESTAuthorization: " . $base64;

// Set data.
$postdata = http_build_query(
    array(
        "authorization" => $base64
    )
);

// Set options - POST.
$opts = array("http" => 
    array(
        "method" => "POST",
        "header" => $header,
        "content" => $postdata
    )
);

// Create context and execute.
$context = stream_context_create($opts);
$result = file_get_contents($url, false, $context);

我不断收到:file_get_contents(http://99.99.99.999:12480/rs/AuthorizationSession): failed to open stream: HTTP request failed! HTTP/1.1 400 Bad Request

显然我更改了IP。这适用于 GET 请求,但不适用于 POST.

我想我的 header 或 post 数据一定有问题,但我想不通。

想法?

http_build_query() 将数组转换为 URL-encoded 查询字符串,例如 name=john&password=s3cr3t 但您发送的 Content-Type header 表示 POST数据在 JSON.

需要更改请求以反映正确的 Content-Type(application/x-www-form-urlencoded,或者 http_build_query 应该 json_encode() 以将数据发送为 JSON.

就目前而言,服务器感到困惑,因为您告诉它您正在发送 JSON,而不是发送一个 URL 编码的字符串(所以本质上是 JSON 解析远程失败)并生成错误请求。

如果您的代码使用 GET,但 POST 失败,这听起来像是目标服务器上位于 99.99.99.999:12480 的主机可能未配置为接受 POST 请求。