0

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

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

4 回答 4

2

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

该问题与客户端的用户代理有关。如果不设置,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

或使用另一个

于 2021-04-02T10:02:48.833 回答
2

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 使用的默认用户代理的更多信息,请参阅文档

于 2021-04-02T11:27:09.793 回答
0

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

Http::dd()->get('http://openlibrary.org/search.json', [
  'q' => 'Johngreen'
]);
于 2021-04-02T09:43:03.410 回答
0

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

$client = new \GuzzleHttp\Client();
$response = $client->get('http://openlibrary.org/search.json', [
    'query' => ['q' => 'Johngreen']
]);
dd(json_decode($response->getBody()));
于 2021-04-02T10:07:14.950 回答