PHP Guzzle请求不工作。适合卷曲

PHP Guzzle请求不工作。适合卷曲,php,api,curl,guzzle,Php,Api,Curl,Guzzle,因此,我刚刚开始尝试理解Guzzle,但我的一个请求不断返回错误,即使使用CURL完成相同的请求也可以正常工作。它们看起来和我一模一样,但也许我遗漏了一些关于狂饮是如何工作的。出于安全原因,我删除了我的访问令牌和事务ID,很明显,我使用的真实令牌正确地插入了实际字符串。我使用的是FreeAgentAPI,虽然我不认为我正在谈论的API与它有任何关系 我确信这是一个简单的错误,因为我不理解Guzzle是如何工作的,但对我来说,Guzzle请求和Curl请求看起来是一样的,所以我不明白为什么我一个请

因此,我刚刚开始尝试理解Guzzle,但我的一个请求不断返回错误,即使使用CURL完成相同的请求也可以正常工作。它们看起来和我一模一样,但也许我遗漏了一些关于狂饮是如何工作的。出于安全原因,我删除了我的访问令牌和事务ID,很明显,我使用的真实令牌正确地插入了实际字符串。我使用的是FreeAgentAPI,虽然我不认为我正在谈论的API与它有任何关系

我确信这是一个简单的错误,因为我不理解Guzzle是如何工作的,但对我来说,Guzzle请求和Curl请求看起来是一样的,所以我不明白为什么我一个请求出错,另一个请求成功

导致错误的Guzzle请求:

$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} 所以我自己想出来了。这只是人类的打字错误,应该是:

'授权:承载'.$access\u令牌

而不是

“授权:”.$access\u令牌

freeagent api实际上在回复中告诉了我这一点,但guzzle并没有给我错误的答案

为了得到回应,我只做了以下几点:

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());
}