PHP Guzzle请求不工作。适合卷曲
因此,我刚刚开始尝试理解Guzzle,但我的一个请求不断返回错误,即使使用CURL完成相同的请求也可以正常工作。它们看起来和我一模一样,但也许我遗漏了一些关于狂饮是如何工作的。出于安全原因,我删除了我的访问令牌和事务ID,很明显,我使用的真实令牌正确地插入了实际字符串。我使用的是FreeAgentAPI,虽然我不认为我正在谈论的API与它有任何关系 我确信这是一个简单的错误,因为我不理解Guzzle是如何工作的,但对我来说,Guzzle请求和Curl请求看起来是一样的,所以我不明白为什么我一个请求出错,另一个请求成功 导致错误的Guzzle请求:PHP Guzzle请求不工作。适合卷曲,php,api,curl,guzzle,Php,Api,Curl,Guzzle,因此,我刚刚开始尝试理解Guzzle,但我的一个请求不断返回错误,即使使用CURL完成相同的请求也可以正常工作。它们看起来和我一模一样,但也许我遗漏了一些关于狂饮是如何工作的。出于安全原因,我删除了我的访问令牌和事务ID,很明显,我使用的真实令牌正确地插入了实际字符串。我使用的是FreeAgentAPI,虽然我不认为我正在谈论的API与它有任何关系 我确信这是一个简单的错误,因为我不理解Guzzle是如何工作的,但对我来说,Guzzle请求和Curl请求看起来是一样的,所以我不明白为什么我一个请
$access_token = '{my_access_token_removed}';
$url = 'https://api.freeagent.com/v2/bank_transactions/{myid}';
$guzzleClient = new Client([
'verify' => false
]);
$request = $guzzleClient->get($url, array(
'debug' => true,
'headers' => array(
'User-Agent' => 'sortitoutsi',
'Accept' => 'application/json',
'Content-Type' => 'application/json',
'Authorization' => $access_token
)
));
此卷曲请求工作正常:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Authorization: Bearer '.$access_token,
'Accept: application/json',
'Content-Type: application/json',
));
curl_setopt($ch, CURLOPT_USERAGENT, 'sortitoutsi');
curl_setopt($ch, CURLOPT_TIMEOUT, 3);
$json_response = curl_exec($ch);
$info = curl_getinfo($ch);
curl_close($ch);
有什么想法吗?我已经在下面复制并粘贴了整个调试信息和堆栈跟踪。我也在使用Laravel,不过我也不认为这是个问题
Middleware.php第69行中的ClientException:客户端错误:400
这是在浏览器中打印出来的Guzzle调试
* Hostname was found in DNS cache
* Hostname in DNS cache was stale, zapped
* Trying 213.129.77.178...
* Connected to api.freeagent.com (213.129.77.178) port 443 (#0)
* successfully set certificate verify locations:
* CAfile: none
CApath: /etc/ssl/certs
* SSL connection using TLSv1.2 / ECDHE-RSA-AES128-GCM-SHA256
* Server certificate:
* subject: C=GB; ST=City of Edinburgh; L=Edinburgh; O=FreeAgent Central Ltd.; CN=a.ssl.freeagent.com
* start date: 2014-11-17 00:00:00 GMT
* expire date: 2017-11-21 12:00:00 GMT
* issuer: C=US; O=DigiCert Inc; CN=DigiCert SHA2 Secure Server CA
* SSL certificate verify ok.
> GET /v2/bank_transactions/{id_removed} HTTP/1.1
Host: api.freeagent.com
User-Agent: sortitoutsi
Accept: application/json
Content-Type: application/json
Authorization: {access_token_removed}
< HTTP/1.1 400 Bad Request
* Server nginx is not blacklisted
< Server: nginx
< Date: Thu, 08 Oct 2015 11:14:49 GMT
< Content-Type: application/json; charset=utf-8
< Transfer-Encoding: chunked
< Connection: keep-alive
< Status: 400 Bad Request
< X-Frame-Options: SAMEORIGIN
< X-XSS-Protection: 1; mode=block
< X-Content-Type-Options: nosniff
< WWW-Authenticate: Bearer
< Access-Control-Allow-Origin: *
< Access-Control-Allow-Methods: DELETE, GET, HEAD, OPTIONS, POST, PUT
< Access-Control-Allow-Headers: Accept, Authorization, Content-Type
< Access-Control-Expose-Headers: Link
< Access-Control-Max-Age: 1728000
< Cache-Control: no-cache
< X-Request-Id: b852b734-2512-4acf-9ae0-474ad1428536
< X-Rev: 6937e9
< X-Host: web3-ash
< X-Runtime: 0.018724
< Set-Cookie: uid=1YFNslYWUCl/7GUlHLMKAg==; expires=Fri, 07-Oct-16 11:14:49 GMT; domain=.freeagent.com; path=/
<
* Connection #0 to host api.freeagent.com left intact
在DNS缓存中找到主机名
*DNS缓存中的主机名已过时,已被清除
*正在尝试213.129.77.178。。。
*连接到api.freeagent.com(213.129.77.178)端口443(#0)
*已成功设置证书验证位置:
*卡菲尔:没有
CApath:/etc/ssl/certs
*使用TLSv1.2/ECDHE-RSA-AES128-GCM-SHA256的SSL连接
*服务器证书:
*主题:C=GB;ST=爱丁堡市;L=爱丁堡;O=自由代理中心有限公司。;CN=a.ssl.freeagent.com
*开始日期:2014-11-17 00:00:00 GMT
*截止日期:2017-11-21 12:00:00 GMT
*发行人:C=美国;O=DigiCert公司;CN=DigiCert SHA2安全服务器CA
*SSL证书验证正常。
>GET/v2/bank_transactions/{id_removed}HTTP/1.1
主持人:api.freeagent.com
用户代理:sortitoutsi
接受:application/json
内容类型:application/json
授权:{access\u token\u removed}
try {
$request = $this->guzzle->request('get', $url, array(
'debug' => true,
'headers' => array(
'User-Agent' => 'sortitoutsi',
'Accept' => 'application/json',
'Content-Type' => 'application/json',
'Authorization' => 'Bearer '.$access_token
)
));
} catch (ClientException $e) {
die((string)$e->getResponse()->getBody());
}
然后,基于api的json响应,我可以很容易地看到我的错误,我没有太多地使用Guzzle,但是我用两个参数构造了客户机类:一个协议+域()和一个选项数组。get()调用仅指定不带域的url。您的url是https,但调试表明使用了HTTP请求
>GET/v2/bank_transactions/{id_removed}HTTP/1.1
我用一个基本url和在GET中指定完整url两种方法进行了尝试,使用相同的响应,$url肯定有https。没有https的调用不包括顶部的服务器证书,这对我来说意味着它使用的是https
try {
$request = $this->guzzle->request('get', $url, array(
'debug' => true,
'headers' => array(
'User-Agent' => 'sortitoutsi',
'Accept' => 'application/json',
'Content-Type' => 'application/json',
'Authorization' => 'Bearer '.$access_token
)
));
} catch (ClientException $e) {
die((string)$e->getResponse()->getBody());
}