file_get_contents() 可以在 4xx 上返回 HTML 吗?

问题描述 投票:0回答:2

我需要从 PHP 发送 POST 请求到远程 HTTPS 地址,该地址返回 JSON。

我使用了以下代码:

    //$url = ...
    $data = array('username' => $username, 'password' => $passwort);

    $options = array(
        'http' => array(
            'header'  => "Content-type: application/x-www-form-urlencoded\r\n",
            'method'  => 'POST',
            'content' => http_build_query($data),
        ),
    );
    $context  = stream_context_create($options);

    $result = file_get_contents($url, false, $context);

但是,在最后一行,该函数失败并出现

failed to open stream: HTTP request failed! HTTP/1.1 403 FORBIDDEN
错误。

服务器还发送了 HTML 格式的解释,但我不知道如何通过

file_get_contents
访问它。帮忙吗?

编辑:我将使用 cURL 代替。

php post file-get-contents
2个回答
2
投票

据我所知这是不可能的。但如果您使用像 Guzzle 这样的 HTTP 客户端,您将能够非常轻松地执行此请求并优雅地处理错误。另外,Guzzle 在底层使用了 cURL,因此您不必直接处理它!

像这样发送您的 POST 请求:

$client = new GuzzleHttp\Client();
$response = $client->post($url, [
    'body' => [
        'username' => $username,
        'password' => $password
    ]
]);

echo $response->getStatusCode();           // 200
echo $response->getHeader('content-type'); // 'application/json; charset=utf8'
echo $response->getBody();                 // {"type":"User"...'
var_export($response->json());             // Outputs the JSON decoded data

因为您将用户名和密码放在 body 数组中,所以它会自动进行 url 编码!

您将能够以面向对象的方式处理错误,并在响应存在时获取 4xx 响应的正文:

try {
    $client->get('https://github.com/_abc_123_404');
} catch (RequestException $e) {
    echo $e->getRequest();
    if ($e->hasResponse()) {
        echo $e->getResponse();
    }
}

请参阅文档了解更多信息。


0
投票

ignore_errors
添加到您的选项中:

    $options = array(
        'http' => array(
            'header'  => "Content-type: application/x-www-form-urlencoded\r\n",
            'method'  => 'POST',
            'content' => http_build_query($data),
            'ignore_errors' => true,
        ),
    );
© www.soinside.com 2019 - 2024. All rights reserved.