Как разместить вложенные JSON в HTTParty в Ruby на Rails - PullRequest
0 голосов
/ 05 января 2020

Я пытаюсь найти правильный способ размещения вложенного объекта JSON в API с помощью HTTParty.

Я получаю успешный ответ, используя Postman для проверки вызова:

POST: http://service.net/api

Заголовки: x-api-key : apikey123

Тело:

{
    "VehicleRequests": [{
        "Id": "Vehicle1",
        "Parameters": {
            "Term": 60,
            "CashDeposit": 10,
            "DepositType": "Percentage",
            "AnnualMileage": 10000
        },
        "PhysicalVehicle": {
            "ExternalVehicleId": "12345",
            "Type": "Car",
            "Status": "PreOwned",
            "OnTheRoadPrice": "30000",
            "Mileage": "12345",
            "Registration": {
                "RegistrationNumber": "REGN0",
                "DateRegisteredWithDvla": "01/01/2018"
            }
        }
    }]
}

Это возвращает:

{
  "Vehicles": [
    {
      "Id": "Vehicle1",
      "HasError": false,
      "Error": null,
      "FinanceQuotations": [
        {
          "HasError": false,
          "Error": null,
          "Finance": {
            "Key": "HP",
            "Notifications": [],
            "Quote": {
             .....
            }
          }
        }
    }
  ]
}

Но я изо всех сил пытается повторить звонок из моего приложения рельсы. У меня есть настроенный класс, который я вызываю при создании

class Monthlyprice
   def initialize()

        @response = HTTParty.post('http://service.net/api',  
        :body =>{
            :VehicleRequests=> [{
                :Id => "Vehicle1",
                :Parameters => {
                    :Term => 60,
                    :CashDeposit => 10,
                    :DepositType => "Percentage",
                    :AnnualMileage => 10000
                },
                :PhysicalVehicle => {
                    :ExternalVehicleId => "12345",
                    :Type => "Car",
                    :Status => "PreOwned",
                    :OnTheRoadPrice => "30000",
                    :Mileage => "12345",
                    :Registration => {
                        :RegistrationNumber => "REGN0",
                        :DateRegisteredWithDvla => "01/01/2018"
                    }
                }
            }].to_json
        },
        :headers => {"x-api-key" => "apikey123"})

        puts(@response)
    end
end

Но это возвращает следующее сообщение об ошибке из API:

{"Error"=>{"UserMessage"=>"Request is invalid.", "TechnicalMessage"=>"Request Validation failed. Request had 2 error(s). 1: request.VehicleRequests[0].Id - The Id field is required.\r\n2: request.VehicleRequests[0].Parameters - The Parameters field is required.", "Code"=>"80000"}}

Это та же ошибка, что я получить от API в почтальоне, если я удаляю объекты Id и Parameters, которые предполагают, что содержимое моего объекта VehicleRequests отформатировано неправильно? Любой совет был бы великолепен!

1 Ответ

0 голосов
/ 05 января 2020

Можете ли вы изменить синтаксис, как показано ниже: -

:body => {
         }.to_json

, что означает, что вы должны использовать .to_json там, где закрывается скобка тела, я думаю, что это только синтаксическая ошибка.

Синтаксис : -

response = HTTParty.post("your request URL",
                  headers: {
                    .....
                    #your header content
                    .....
                  },
                  body: {
                  ......
                   #your body content
                  .....

                   }.to_json
                 )

Я только что отредактировал ваш код, пожалуйста, попробуйте следующий код: -

@response = HTTParty.post('http://service.net/api',
        :headers => {"x-api-key" => "apikey123"},  
        :body =>{
            :VehicleRequests=> [{
                :Id => "Vehicle1",
                :Parameters => {
                    :Term => 60,
                    :CashDeposit => 10,
                    :DepositType => "Percentage",
                    :AnnualMileage => 10000
                },
                :PhysicalVehicle => {
                    :ExternalVehicleId => "12345",
                    :Type => "Car",
                    :Status => "PreOwned",
                    :OnTheRoadPrice => "30000",
                    :Mileage => "12345",
                    :Registration => {
                        :RegistrationNumber => "REGN0",
                        :DateRegisteredWithDvla => "01/01/2018"
                    }
                }
            }]
        }.to_json
        )

Надеюсь, это поможет вам:)

...