Guzzle中的$ client-> get()未能返回JSON

时间:2017-07-01 20:15:13

标签: php guzzle

// https://api.xivdb.com/character/17803411 <-- fail
// https://api.xivdb.com/character/1395894 <-- success
function GetCharacter( $url )
{
    $client = new GuzzleHttp\Client();

    $res = $client->get( $url );

    echo $res->getStatusCode();
    exit();


    return json_decode( $res->getBody(), true );
}

在上面的代码中,当我使用成功的$ url时,我的代码工作,我得到状态代码200.但是,当我使用失败的$ url时,我只是得到泛型

  

500 - 内部服务器错误。您的资源存在问题   正在寻找,它无法显示。

现在,当直接转到它时,失败$ url的返回是:

  

{code:404,错误:“你要找的角色不可能   找到。该字符可能仍在处理或XIVSync   服务已经下降。“}

我的问题是,为什么$ client-&gt; get()从成功的$ url返回JSON,但另一方面只是flat失败?

2 个答案:

答案 0 :(得分:3)

如果响应不是200,Guzzle将触发异常。这就是为什么你会看到500错误。

你必须像这样抓住这个错误。

try {
    $res = $client->get($url);
}
catch (GuzzleHttp\Exception\ClientException $e) {
    // error.
}

答案 1 :(得分:0)

我试图请求这些端点。

<?php

require 'vendor/autoload.php';

use GuzzleHttp\Client;
use GuzzleHttp\Exception\ClientException;

$client = new Client();

$validApiEndpoint = 'https://api.xivdb.com/character/1395894';
$invalidApiEndpoint = 'https://api.xivdb.com/character/17803411';

try {
    $response = $client->get($invalidApiEndpoint);

    echo $response->getStatusCode();
} catch (ClientException $e) {
    echo $e->getMessage();
}

Guzzle只是抛出异常,因为请求中的状态代码不是200 $invalidApiEndpont

您应该使用适配器模式创建某种适配器类,以防止在应用程序出现问题时直接抛出异常。直接使用Guzzle客户端是一个坏主意。

如果您对自己的适配器模式实现有疑问,我可以为您描述。