【问题标题】:Why is my POST file_get_contents returning HTTP Bad Request?为什么我的 POST file_get_contents 返回 HTTP 错误请求?
【发布时间】:2016-05-12 23:07:03
【问题描述】:

这是我的代码:

$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。

我想我的标题或帖子数据一定有问题,但我想不通。

想法?

【问题讨论】:

    标签: php rest post curl file-get-contents


    【解决方案1】:

    需要更改请求以反映正确的 Content-Type(application/x-www-form-urlencodedhttp_build_query 实际上应该是 json_encode() 以将数据作为 JSON 发送。

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

    【讨论】:

    • 嗯,使用该内容类型会导致:HTTP/1.1 415 Unsupported Media Type
    • 是否有文档说明要执行哪种类型的 POST?如果他们期待 JSON,那么您在 OP 中的 Content-Type 标头是正确的,但您应该使用 json_encode 而不是 http_build_query。就目前而言,您的实际数据与内容类型不匹配,但似乎不需要标准的 application/x-www-form-urlencoded。
    • 是的,他们期待 JSON,你绝对正确,我应该使用 json_encode 并且它现在可以工作。我没有正确查看 http_build_query 并做出了一些假设!我的举动很糟糕。
    • 太棒了,很高兴就是这样。立即更新答案以反映正确答案。
    【解决方案2】:

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

    【讨论】:

    • 对不起,我应该提到我正在使用的提供商能够使用他们自己的功能成功地发布到服务器。 (不是 PHP。)
    猜你喜欢
    • 1970-01-01
    • 2019-05-16
    • 1970-01-01
    • 1970-01-01
    • 2017-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多