【问题标题】:When making a batch geocoding request using the Geocodio API, how can I handle 422 errors?使用 Geocodio API 发出批量地理编码请求时,如何处理 422 错误?
【发布时间】:2017-07-16 12:37:28
【问题描述】:

我正在读取包含一些地址信息的文件。某些地址无法处理(错误代码 422)。如何返回可处理地址的结果并将错误位置留空?

    require 'myFunctions.php';
    require_once '../../vendor/autoload.php';
    use Stanley\Geocodio\Client;

    $client = new Client('Your API key');

    //Read in address data.
    $AddressData = file('address.txt');

    //Send a request to the API.
    $location = $client->post($AddressData);

Screenshot of error

Illogical character

【问题讨论】:

    标签: php


    【解决方案1】:

    认为 API 会自动处理错误并将它们留空,? (如果您共享错误的屏幕截图会有所帮助) - 但无论如何,如果您的意思是捕获此类错误(异常),这里是 Geocodio中所有可能异常的列表> (source):

    An HTTP 403 error raises a GeocodioAuthError
    An HTTP 422 error raises a GeocodioDataError and the error message will be reported through the exception
    An HTTP 5xx error raises a GeocodioServerError
    An unmatched non-200 response will simply raise Exception
    

    在您的情况下,对于不可处理的地址,您应该捕获 GeocodioDataError 异常。无论如何购买,捕获所有受支持的(Catch 'Em All)是一个好习惯。我想你应该能够做这样的事情:

    try
    {
      $location = $client->post($AddressData);
    }
    catch(\Stanley\Geocodio\GeocodioAuthError)
    {
      // do something
    }
    catch(\Stanley\Geocodio\GeocodioDataError)
    {
      // do something
    }
    catch(\Stanley\Geocodio\GeocodioServerError)
    {
      // do something
    }
    catch (\Exception $e)
    {
      // do something
    }
    

    在随附的屏幕截图中,我看到您使用的是Guzzle!在Guzzle 中,您可以捕获这样的异常(more read):

    try
    {
      $location = $client->post($AddressData);
    }
    catch (Guzzle\Http\Exception\BadResponseException $e)
    {
      // do something
    }
    

    【讨论】:

    • 添加了截图。
    • 好的,现在我有了处理错误的语法,我将如何提取没有失败的位置的纬度/经度?抱歉,如果这是一个愚蠢的问题。这是我使用的第一个 API。感谢您的帮助!
    • @gente002 请查看docs。该库返回一个包含 lat/long 的 JSON。只需查看上面链接中的示例响应,了解如何在 PHP 中读取 JSON 对象。您可以在位置下找到 lan/long。例如:"location": { "lat": 38.886665, "lng": -77.094733 },
    • 对不起,我可能没有问得很清楚。我了解如何从响应中获取纬度/经度,只要请求数组不会导致任何错误。但是,当我发送一个包含至少 1 个响应为 422(不可处理实体)的地址的更大数组时,它给了我共享的错误。现在,我可以使用您的 try/catch 代码来捕获错误,但现在我只是回到尝试使用同一个数组调用 api。我确实尝试了一种循环方法,它单独发送每个位置,但这违背了“批量”请求的目的。
    • 我知道我的问题是什么。在我的文本文件中,有一个不合逻辑的字符抛出了请求。我明白为什么这让你现在感到困惑。截图如上。再次感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 2018-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-09
    • 1970-01-01
    • 2020-06-07
    • 2020-01-10
    相关资源
    最近更新 更多