HTTP请求的file_get_contents带,得到响应码(HTTP requests with

2019-07-23 07:16发布

我想使用file_get_contents连同stream_context_create进行POST请求。 到目前为止我的代码:

    $options = array('http' => array(
        'method'  => 'POST',
        'content' => $data,
        'header'  => 
            "Content-Type: text/plain\r\n" .
            "Content-Length: " . strlen($data) . "\r\n"
    ));
    $context  = stream_context_create($options);
    $response = file_get_contents($url, false, $context);

它工作正常,然而,当HTTP错误发生,它吐出了一个警告:

file_get_contents(...): failed to open stream: HTTP request failed! HTTP/1.0 400 Bad Request

并返回false。 有没有一种办法:

  • 抑制警告(我打算把我自己的异常失败的情况下)
  • 获得从流中的错误信息(至少,响应码)

Answer 1:

http://php.net/manual/en/reserved.variables.httpresponseheader.php

file_get_contents("http://example.com");
var_dump($http_response_header);


Answer 2:

添加几行代码,以接受响应,以获得HTTP代码

function getHttpCode($http_response_header)
{
    if(is_array($http_response_header))
    {
        $parts=explode(' ',$http_response_header[0]);
        if(count($parts)>1) //HTTP/1.0 <code> <text>
            return intval($parts[1]); //Get code
    }
    return 0;
}

@file_get_contents("http://example.com");
$code=getHttpCode($http_response_header);

隐藏错误输出两种意见都OK,ignore_errors = true或@(我喜欢@)



Answer 3:

答案(包括一个由OP接受)的无实际满足两个要求:

  • 抑制警告(我打算把我自己的异常失败的情况下)
  • 获得从流中的错误信息(至少,响应码)

这是我的看法:

function fetch(string $method, string $url, string $body, array $headers = []) {
    $context = stream_context_create([
        "http" => [
            // http://docs.php.net/manual/en/context.http.php
            "method"        => $method,
            "header"        => implode("\r\n", $headers),
            "content"       => $body,
            "ignore_errors" => true,
        ],
    ]);

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

    /**
     * @var array $http_response_header materializes out of thin air
     */

    $status_line = $http_response_header[0];

    preg_match('{HTTP\/\S*\s(\d{3})}', $status_line, $match);

    $status = $match[1];

    if ($status !== "200") {
        throw new RuntimeException("unexpected response status: {$status_line}\n" . $response);
    }

    return $response;
}

这将抛出一个非200响应,但你可以很容易地从那里工作,例如添加一个简单的Response类和return new Response((int) $status, $response); 如果符合您的使用情况较好。

例如,做一个JSON POST到API端点:

$response = fetch(
    "POST",
    "http://example.com/",
    json_encode([
        "foo" => "bar",
    ]),
    [
        "Content-Type: application/json",
        "X-API-Key: 123456789",
    ]
);

使用注意事项"ignore_errors" => truehttp语境映射-这将防止函数引发错误给非2xx状态代码。

这是最有可能的错误抑制的大多数使用情况“正确的”量-我不建议使用@错误抑制操作,因为这也将抑制这样的错误只是传递了错误的参数,这可能会不小心隐藏的错误在调用代码。



Answer 4:

我去用一种不同的问题,此页面,所以张贴我的答案。 我的问题是,我只是想抑制警告通知,并为用户显示一个自定义警告邮件,所以这个简单而明显的修复帮助我:

// Suppress the warning messages
error_reporting(0);

$contents = file_get_contents($url);
if ($contents === false) {
  print 'My warning message';
}

如果需要的话,回头之后错误报告:

// Enable warning messages again
error_reporting(-1);


Answer 5:

@file_get_contentsignore_errors = true是不一样的:第一不返回任何东西; 第二抑制错误消息,但返回服务器响应(例如400错误请求)。

我用这样的函数:

$result = file_get_contents(
  $url_of_API, 
  false, 
  stream_context_create([
    'http' => [
      'content' => json_encode(['value1' => $value1, 'value2' => $value2]), 
      'header' => 'Authorization: Basic XXXXXXXXXXXXXXX', 
      'ignore_errors' => 1, 
      'method' => 'POST', 
      'timeout' => 10
    ]
  ])
);

return json_decode($result)->status;

它返回200(OK)或400(错误请求)。

它完美了,它比卷曲容易。



文章来源: HTTP requests with file_get_contents, getting the response code