file_get_contents 抛出 400 Bad Request 错误 PHP

发布于 2024-12-21 06:00:15 字数 573 浏览 0 评论 0原文

我只是使用 file_get_contents() 来获取来自用户的最新推文,如下所示:

$tweet = json_decode(file_get_contents('http://api.twitter.com/1/statuses/user_timeline/User.json'));

这在我的本地主机上运行良好,但是当我将其上传到我的服务器时,它会抛出此错误:

警告: file_get_contents(http://api .twitter.com/1/statuses/user_timeline/User.json) [function.file-get-contents]:无法打开流:HTTP 请求失败! HTTP/1.0 400 错误请求...

不确定是什么原因导致的,也许我需要在服务器上设置 php 配置?

提前致谢!

I'm just using a file_get_contents() to get the latest tweets from a user like this:

$tweet = json_decode(file_get_contents('http://api.twitter.com/1/statuses/user_timeline/User.json'));

This works fine on my localhost but when I upload it to my server it throws this error:

Warning: file_get_contents(http://api.twitter.com/1/statuses/user_timeline/User.json) [function.file-get-contents]:failed to open stream: HTTP request failed! HTTP/1.0 400 Bad Request...

Not sure what might be causing it, maybe a php configuration I need to set on my server?

Thanks in advance!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

怀里藏娇 2024-12-28 06:00:15

您可能想尝试使用curl而不是file_get_contents来检索数据。 curl 对错误处理有更好的支持:

// make request
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://api.twitter.com/1/statuses/user_timeline/User.json"); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
$output = curl_exec($ch);   

// convert response
$output = json_decode($output);

// handle error; error output
if(curl_getinfo($ch, CURLINFO_HTTP_CODE) !== 200) {

  var_dump($output);
}

curl_close($ch);

这可能会让您更好地了解为什么会收到错误。一个常见的错误是达到服务器上的速率限制。

You might want to try using curl to retrieve the data instead of file_get_contents. curl has better support for error handling:

// make request
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://api.twitter.com/1/statuses/user_timeline/User.json"); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
$output = curl_exec($ch);   

// convert response
$output = json_decode($output);

// handle error; error output
if(curl_getinfo($ch, CURLINFO_HTTP_CODE) !== 200) {

  var_dump($output);
}

curl_close($ch);

This may give you a better idea why you're receiving the error. A common error is hitting the rate limit on your server.

深陷 2024-12-28 06:00:15

您可以使用 file_get_contents 添加 ignore_errors 选项设置为 true,这样您将在出现错误时获得响应的完整正文(例如,HTTP/1.1 400)而不仅仅是一个简单的 false

您可以在此处查看示例: https://stackoverflow.com/a/11479968/3926617

如果您想访问响应的标头,您可以在请求后使用 $http_response_header

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

You can use file_get_contents adding the ignore_errors option set to true, in this way you will get the entire body of the response in case of error (HTTP/1.1 400, for example) and not only a simple false.

You can see an example here: https://stackoverflow.com/a/11479968/3926617

If you want access to response's headers, you can use $http_response_header after the request.

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

jJeQQOZ5 2024-12-28 06:00:15

只是对本的回答做一点补充。
根据 PHP 手册,在初始化 cURL 时可以设置 CURLOPT_URL 选项用curl_init()处理。

// make request
$ch = curl_init("http://api.twitter.com/1/statuses/user_timeline/User.json");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
$output = curl_exec($ch);   

// convert response
$output = json_decode($output);

// handle error; error output
if(curl_getinfo($ch, CURLINFO_HTTP_CODE) !== 200) {

  var_dump($output);
}

curl_close($ch);

Just a little addendum on Ben's answer.
According to the PHP manual the CURLOPT_URL option may be set when inizializing the cURL handle with curl_init().

// make request
$ch = curl_init("http://api.twitter.com/1/statuses/user_timeline/User.json");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
$output = curl_exec($ch);   

// convert response
$output = json_decode($output);

// handle error; error output
if(curl_getinfo($ch, CURLINFO_HTTP_CODE) !== 200) {

  var_dump($output);
}

curl_close($ch);
笑着哭最痛 2024-12-28 06:00:15

在 file_get_contents 之前添加此代码

 stream_context_set_default( [
        'ssl' => [
            'verify_peer' => false,
            'verify_peer_name' => false,
        ],
        'http' => [
            'ignore_errors' => true,
        ]
    ]);

Add this code before file_get_contents

 stream_context_set_default( [
        'ssl' => [
            'verify_peer' => false,
            'verify_peer_name' => false,
        ],
        'http' => [
            'ignore_errors' => true,
        ]
    ]);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文