我自己编写了一个REST API,它使用另一个REST API。
它通常有效,但它也经常导致400_Bad_Request。
流程是这样的:它工作,工作,工作这么长时间,然后它不工作,不工作,不工作这么长时间。然后我休息一下,一两个小时后,它又起作用了。不管我使用什么浏览器- chrome或firefox(但我确实尝试清除缓存)。如果我直接在浏览器中输入URL(我试图在我的web服务中使用),然后我得到正确的响应,所以它不像他们封锁我的ip地址一段时间。
public function apiFunction()
{
parse_str($_SERVER["QUERY_STRING"]);
$host = "THE API ADDRESS"; //omitted due to privacy
$tran = new apiCallClass( "username", "pwd" ); //omitted due to privacy
$tran->setSomeData( $var1, $var2, $var3 );
$tran->setSomeRequest( $var4, $var5 );
$tran->setSomeField("somevar", $var6);
$tran->setHost( $host );
$tran->execute();
parse_str($tran->ResponseRaw,$theArr);
//... other code goes here,
//but I can already see ResponseRaw has 400_Bad_Request
}
这个函数可能是问题的根源:如果我复制$url的值并将其粘贴到浏览器中,它可以工作,所以一定是这个函数做错了:
function processRequest( $url )
{
$temp = $url;
$ch = curl_init($url);
curl_setopt($ch,CURLOPT_FRESH_CONNECT,TRUE);
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);
curl_setopt($ch,CURLOPT_HEADER, 0);
if ( !$this->isBlank($this->ProxyHost) )
{
curl_setopt ($ch, CURLOPT_PROXYTYPE, CURLPROXY_HTTP);
curl_setopt ($ch, CURLOPT_PROXY,$this->ProxyHost);
} curl_setopt ($ch, CURLOPT_URL, $url);
curl_setopt ($ch, CURLOPT_TIMEOUT, 120);
curl_setopt($ch,CURLOPT_RETURNTRANSFER, TRUE);
$this->parseResponse( curl_exec($ch) );
}
如果您发出完全相同的请求,并且响应除了400状态码之外没有返回任何消息体,那么您将需要联系API提供者。
我怀疑你达到了某种速率限制,如果你从相同的IP地址执行大量的请求(他们应该返回一个429太多的请求,但我已经看到许多api返回400速率限制)。