// 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失败?
答案 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客户端是一个坏主意。
如果您对自己的适配器模式实现有疑问,我可以为您描述。