我需要从 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 代替。
据我所知这是不可能的。但如果您使用像 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();
}
}
请参阅文档了解更多信息。
将
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,
),
);