我正在尝试使用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);
当我在浏览器中粘贴网址时,服务器响应正确。 我了解到这是由服务器拒绝客户端的HTTP版本引起的,但我不知道为什么会发生这种情况。
非常感谢任何帮助。提前致谢
答案 0 :(得分:30)
我发现了问题,这是一个简单的编码错误 - 缺少网址编码。
我最初没有注意到它的原因是因为在我进行一些编辑之前代码是正常的,并且在调用服务器之前我错过了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);
另外,感谢您的所有时间和回复,这些都是信息性的。
答案 1 :(得分:9)
您可以将create a stream context的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);
顺便说一句:不要忘记使用urlencode
正确地转义URI参数值。
答案 2 :(得分:0)
你能嗅到电线上发生的事吗?在线路上看到HTTP请求的格式会有很大帮助。
没有看到,我最好的猜测是服务器没有很好地实现,并拒绝HTTP / 1.1请求。尝试在Curl上设置--http1.0
,看看会发生什么......
答案 3 :(得分:0)
我遇到了同样的问题,在我的情况下,罪魁祸首是请求URL末尾的错误换行符/ CRLF字符,urlencode()
没有捕获它(或者它可能会编码但是它仍导致服务器产生错误)。一旦我发现问题,请求就会再次开始工作,即使没有流上下文选项。
希望这会有所帮助。
答案 4 :(得分:0)
有些时候我们仍然会遇到错误
file_get_contents($api);
在这种情况下,试试这个:
fopen($api,"r");
答案 5 :(得分:0)
我也面临同样的问题.. 后来我发现从mysql中检索结果时,限$ count, $ count是-ve。确定网址工作正常。 仅在url中存在一些问题,而不是file_get_contents或http版本问题..