Laravel Guzzle HTTP 不断返回 404

Laravel Guzzle HTTP keep returning 404

我正在使用 openlibrary 的 API 来获取图书数据。我有一些 API(不是全部)保持 return 404 的问题,但是当我使用邮递员进行测试时,它工作正常。

$response = Http::get('http://openlibrary.org/search.json', [
'q' => 'Johngreen'
]);
dd($response->body());

首先尝试下面的代码以查看响应的所有内容。

Http::dd()->get('http://openlibrary.org/search.json', [
  'q' => 'Johngreen'
]);

我用 Laravel 测试了这个端点,我遇到了同样的问题,但它适用于 Postman 和浏览器。

问题与客户端的User-Agent有关。如果不设置,Openlibrary 无法检查 API 调用的来源(浏览器和 Postman 发送自己的用户代理)。

我用这段代码解决了:

$guzzle_client = new \GuzzleHttp\Client();

$response = $this->guzzleClient->get("http://openlibrary.org/search.json?q=Johngreen", [
    'headers' => ['User-Agent' => 'PUT AN USER AGENT HERE']
]);
        
$response_body = json_decode($response->getBody()->getContents(), true);
dd($response_body);

尝试使用这个用户代理:

Mozilla/5.0 (Macintosh; Intel Mac OS X 11_2_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36

或使用另一个

您正在使用 Guzzle。尝试使用以下代码来消费 API.

$client = new \GuzzleHttp\Client();
$response = $client->get('http://openlibrary.org/search.json', [
    'query' => ['q' => 'Johngreen']
]);
dd(json_decode($response->getBody()));

openlibrary 不接受 guzzlehttp 用户代理,请尝试仅使用 curl 或浏览器用户代理。
这两部作品

使用 curl 用户代理


try{
     $response = Http::withHeaders([  
         'User-Agent' => 'curl/7.65.3'
     ])->get('https://openlibrary.org/search.json?q=Johngreen');
     dd($response->body());
} catch(\Illuminate\Http\Client\RequestException $e){
     // Log your errors
}

使用浏览器用户代理

try{
      $response = Http::withHeaders([
          'User-Agent' => 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36'   
      ])->get('https://openlibrary.org/search.json?q=Johngreen');
      dd($response->body());
} catch(\Illuminate\Http\Client\RequestException $e){
      // Log your errors
}

有关 guzzle 使用的默认用户代理的详细信息,请参阅 docs