Получение Shippo::Exceptions::APIServerError: Невозможно прочитать данные, полученные обратно с сервера, при попытке новой отправки Shippo

В приложении Rails 4, использующем Shippo для доставки, я передаю следующий хеш в Shippo::Shipment.create(shippo_params) в соответствии с документами API:

{
:object_purpose => "PURCHASE",
         :async => false,
    :address_to => {
    "object_purpose" => "PURCHASE",
              "name" => "Test Guy",
           "street1" => "5000 Test St",
           "street2" => "",
              "city" => "New Orleans",
             "state" => "LA",
               "zip" => "70115",
           "country" => "US"
},
  :address_from => {
    "object_purpose" => "PURCHASE",
           "company" => "MyCompany",
           "street1" => "1305 Business Lane",
           "street2" => "Suite O",
              "city" => "New Orleans",
             "state" => "LA",
               "zip" => "70123",
           "country" => "US",
             "phone" => "+1 999 999 9999",
},
        :parcel => {
           "length" => 5,
            "width" => 5,
           "height" => 5,
    "distance_unit" => :in,
           "weight" => 1,
        "mass_unit" => :lb
}

}

Я тогда получаю ошибку:

Shippo::Exceptions::APIServerError: Unable to read data received back from the server.  

Если я использую следующий хэш params, как указано в API, он работает:

params   = { object_purpose: 'PURCHASE',
                    async:          false,
                    address_from:   {
                      object_purpose: 'PURCHASE',
                      name:           'Mr Hippo',
                      company:        'Shippo',
                      street1:        '215 Clayton St.',
                      street2:        '',
                      city:           'San Francisco',
                      state:          'CA',
                      zip:            '94117',
                      country:        'US',
                      phone:          '+1 555 341 9393',
                      email:          'support@goshippo.com' },
                    address_to:     {
                      object_purpose: 'PURCHASE',
                      name:           'Mrs Hippo"',
                      company:        'San Diego Zoo',
                      street1:        '2920 Zoo Drive',
                      city:           'San Diego',
                      state:          'CA',
                      zip:            '92101',
                      country:        'US',
                      phone:          '+1 555 341 9393',
                      email:          'hippo@goshippo.com' },
                    parcel:         {
                      length:        5,
                      width:         2,
                      height:        5,
                      distance_unit: :in,
                      weight:        2,
                      mass_unit:     :lb }
                    }

Между ними есть тонкие различия: при вызове inspect у первого есть некоторые экранированные кавычки в ключах, а у другого нет, но я не знаю, почему это будет иметь значение (или почему это так).

Может кто-нибудь сказать мне, в чем разница и почему Shippo возвращает эту ошибку?

1 ответ

Решение

Есть две проблемы:

  1. В вашем запросе объекты Address не содержат все обязательные поля. Вот рабочий запрос с вашими данными - я добавил значения электронной почты для обоих адресов и значение имени для объекта address_from: https://gist.github.com/simonkreuz/2da33c20d4015b0bc64079078db62ddc
  2. Ruby-оболочка Shippo неправильно анализирует возвращенное сообщение об ошибке API. API фактически возвращает ошибку, указывающую, что объекты Address не содержат все обязательные поля. Я подал заявку в инженерную команду Shippo здесь https://github.com/goshippo/shippo-ruby-client/issues/22.
Другие вопросы по тегам