簡體   English   中英

PHP Guzzle請求無法正常工作。 與CURL一起正常工作

[英]PHP Guzzle request not working. Works fine with CURL

因此,我剛剛開始嘗試理解Guzzle,但是我的一個請求一直返回錯誤,即使使用CURL完成完全相同的請求也可以正常工作。 它們看起來與我相同,但也許我缺少有關Guzzle的工作方式的一些信息。 出於安全原因,我已經刪除了訪問令牌和交易ID,顯然,我使用的真實令牌中包含正確的實際字符串。 我正在使用Freeagent API,盡管我不認為與之交談的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
    )
));

這個CURL請求可以正常工作:

$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

in Middleware.php line 69
at Middleware::GuzzleHttp\{closure}(object(Response)) in Promise.php line 199
at Promise::callHandler('1', object(Response), array(object(Promise), object(Closure), null)) in Promise.php line 152
at Promise::GuzzleHttp\Promise\{closure}() in TaskQueue.php line 60
at TaskQueue->run() in CurlMultiHandler.php line 96
at CurlMultiHandler->tick() in CurlMultiHandler.php line 123
at CurlMultiHandler->execute(true) in Promise.php line 240
at Promise->invokeWaitFn() in Promise.php line 217
at Promise->waitIfPending() in Promise.php line 261
at Promise->invokeWaitList() in Promise.php line 219
at Promise->waitIfPending() in Promise.php line 62
at Promise->wait() in Client.php line 129
at Client->request('get', 'https://api.freeagent.com/v2/bank_transactions/{id_removed}', array('debug' => true, 'headers' => array('User-Agent' => 'sortitoutsi', 'Accept' => 'application/json', 'Content-Type' => 'application/json', 'Authorization' => '{access_token_removed}'))) in Client.php line 87
at Client->__call('get', array('https://api.freeagent.com/v2/bank_transactions/{id_removed}', array('debug' => true, 'headers' => array('User-Agent' => 'sortitoutsi', 'Accept' => 'application/json', 'Content-Type' => 'application/json', 'Authorization' => '{access_token_removed}')))) in Freeagent.php line 185
at Client->get('https://api.freeagent.com/v2/bank_transactions/{id_removed}', array('debug' => true, 'headers' => array('User-Agent' => 'sortitoutsi', 'Accept' => 'application/json', 'Content-Type' => 'application/json', 'Authorization' => '{access_token_removed}'))) in Freeagent.php line 185
at Freeagent->getTransaction('{id_removed}') in Facade.php line 210
at Facade::__callStatic('getTransaction', array('{id_removed}')) in TestingController.php line 17
at FreeagentApi::getTransaction('{id_removed}') in TestingController.php line 17
at TestingController->getTesting()
at call_user_func_array(array(object(TestingController), 'getTesting'), array()) in Controller.php line 256
at Controller->callAction('getTesting', array()) in ControllerDispatcher.php line 164
at ControllerDispatcher->call(object(TestingController), object(Route), 'getTesting') in ControllerDispatcher.php line 112
at ControllerDispatcher->Illuminate\Routing\{closure}(object(Request))
at call_user_func(object(Closure), object(Request)) in Pipeline.php line 139
at Pipeline->Illuminate\Pipeline\{closure}(object(Request))
at call_user_func(object(Closure), object(Request)) in Pipeline.php line 103
at Pipeline->then(object(Closure)) in ControllerDispatcher.php line 114
at ControllerDispatcher->callWithinStack(object(TestingController), object(Route), object(Request), 'getTesting') in ControllerDispatcher.php line 69
at ControllerDispatcher->dispatch(object(Route), object(Request), 'Susie\Http\Controllers\TestingController', 'getTesting') in Route.php line 201
at Route->runWithCustomDispatcher(object(Request)) in Route.php line 134
at Route->run(object(Request)) in Router.php line 704
at Router->Illuminate\Routing\{closure}(object(Request))
at call_user_func(object(Closure), object(Request)) in Pipeline.php line 139
at Pipeline->Illuminate\Pipeline\{closure}(object(Request))
at call_user_func(object(Closure), object(Request)) in Pipeline.php line 103
at Pipeline->then(object(Closure)) in Router.php line 706
at Router->runRouteWithinStack(object(Route), object(Request)) in Router.php line 671
at Router->dispatchToRoute(object(Request)) in Router.php line 631
at Router->dispatch(object(Request)) in Kernel.php line 236
at Kernel->Illuminate\Foundation\Http\{closure}(object(Request))
at call_user_func(object(Closure), object(Request)) in Pipeline.php line 139
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in Debugbar.php line 49
at Debugbar->handle(object(Request), object(Closure))
at call_user_func_array(array(object(Debugbar), 'handle'), array(object(Request), object(Closure))) in Pipeline.php line 124
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in ActivatedUser.php line 50
at ActivatedUser->handle(object(Request), object(Closure))
at call_user_func_array(array(object(ActivatedUser), 'handle'), array(object(Request), object(Closure))) in Pipeline.php line 124
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in VerifyCsrfToken.php line 21
at VerifyCsrfToken->handle(object(Request), object(Closure))
at call_user_func_array(array(object(VerifyCsrfToken), 'handle'), array(object(Request), object(Closure))) in Pipeline.php line 124
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in ShareErrorsFromSession.php line 49
at ShareErrorsFromSession->handle(object(Request), object(Closure))
at call_user_func_array(array(object(ShareErrorsFromSession), 'handle'), array(object(Request), object(Closure))) in Pipeline.php line 124
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in StartSession.php line 62
at StartSession->handle(object(Request), object(Closure))
at call_user_func_array(array(object(StartSession), 'handle'), array(object(Request), object(Closure))) in Pipeline.php line 124
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in AddQueuedCookiesToResponse.php line 37
at AddQueuedCookiesToResponse->handle(object(Request), object(Closure))
at call_user_func_array(array(object(AddQueuedCookiesToResponse), 'handle'), array(object(Request), object(Closure))) in Pipeline.php line 124
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in EncryptCookies.php line 59
at EncryptCookies->handle(object(Request), object(Closure))
at call_user_func_array(array(object(EncryptCookies), 'handle'), array(object(Request), object(Closure))) in Pipeline.php line 124
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in CheckForMaintenanceMode.php line 42
at CheckForMaintenanceMode->handle(object(Request), object(Closure))
at call_user_func_array(array(object(CheckForMaintenanceMode), 'handle'), array(object(Request), object(Closure))) in Pipeline.php line 124
at Pipeline->Illuminate\Pipeline\{closure}(object(Request))
at call_user_func(object(Closure), object(Request)) in Pipeline.php line 103
at Pipeline->then(object(Closure)) in Kernel.php line 122
at Kernel->sendRequestThroughRouter(object(Request)) in Kernel.php line 87
at Kernel->handle(object(Request)) in index.php line 53

這是在瀏覽器中打印的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

所以我自己弄清楚了。 這只是人類的錯字,應該是:

'授權:不記名'。$ access_token

代替

'授權:'。$ access_token

freeagent api實際上是在響應中告訴我的,但是狂飲並沒有給我錯。

為了得到響應,我只是做了:

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響應輕松看到我的錯誤

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM