15

我正在尝试使用file_get_contents()从服务器获取响应并遇到此错误。有人能告诉我是什么原因以及如何解决吗?代码部分是:

$api = "http://smpp5.routesms.com:8080/bulksms/sendsms?username=$username&password=$password&source=$source&destination=$destin&dlr=$dlr&type=$type&message=$message";
$resp = file_get_contents($api);

当我将 URL 粘贴到浏览器中时,服务器响应正确。我了解到这是由服务器拒绝客户端的 HTTP 版本引起的,但我不知道为什么会发生这种情况。

任何帮助深表感谢。提前致谢

4

6 回答 6

35

我发现了问题,这是一个简单的编码错误——缺少 url 编码。

起初我没有注意到它的原因是因为在我做一些编辑之前代码是好的,我urlencode()在调用服务器之前错过了这个函数,导致url中有空格。

这似乎是大多数人发生此错误的原因。因此,如果您遇到这种情况,请使用urlencode()所有可能在其值中包含空格的变量用作 URL 参数。因此,在我的问题中,固定代码将如下所示:

$api = "http://smpp5.routesms.com:8080/bulksms/sendsms?username=$username&password=$password&source=$source&destination=$destin&dlr=$dlr&type=$type&message=" . urlencode($message);
$resp = file_get_contents($api);

另外,感谢您所有的时间和回复,这些都是信息性的。

于 2010-05-05T05:59:59.920 回答
10

您可以创建一个将 HTTP 版本设置为 1.0 的流上下文,并将该上下文用于file_get_contents

$options = array(
    'http' => array(
        'protocol_version' => '1.0',
        'method' => 'GET'
    )
);
$context = stream_context_create($options);
$api = "http://smpp5.routesms.com:8080/bulksms/sendsms?username=$username&password=$password&source=$source&destination=$destin&dlr=$dlr&type=$type&message=$message";
$resp = file_get_contents($api, false, $context);

顺便说一句:不要忘记使用正确转义 URI 参数值urlencode

于 2010-05-03T12:42:41.440 回答
1

我遇到了同样的问题,在我的情况下,罪魁祸首是请求 URL 末尾的错误换行符/CRLF 字符,它没有被捕获urlencode()(或者它确实对其进行了编码,但它仍然导致服务器产生错误)。一旦我发现问题,请求就会再次开始工作,即使没有流上下文选项。

希望这对其他人有帮助。

于 2011-09-07T00:57:49.250 回答
0

我也面临同样的问题..后来我发现在从 mysql 检索结果时,Limit $count , $count 是 -ve。修复网址工作正常。仅在 url 中存在一些问题,而不是 file_get_contents 或 http 版本问题..

于 2013-06-27T11:08:39.410 回答
0

有时我们仍然会出错

file_get_contents($api);

在这种情况下,试试这个:

fopen($api,"r");
于 2012-08-28T15:49:57.390 回答
0

你能嗅出电线上发生的事情吗?查看在线发送的 HTTP 请求的格式会很有帮助。

没有看到这一点,我最好的猜测是服务器没有很好地实现,并且拒绝了 HTTP/1.1 请求。尝试设置--http1.0卷曲,看看会发生什么......

于 2010-05-03T10:51:34.027 回答