RF4
RF4

Reputation: 13

Posting JSON in Ruby with HTTParty Returns invalid_request

It seems that my post is reaching the host, however it may be formatted incorrectly? Not coming in as JSON?

The host's result is presenting me with an error Code: invalid_request Message: Validation failed on the request.

Host Docs:

This means that Automatic Ordering didn't have enough information to place the order. This almost always occurs because you haven't fully filled out your Amazon account information on your Automatic Ordering section.

My error result includes the following:

{
  "_type": "error",
  "_request_id": "5623dcc59ca1bb1e76000a9f",
  "code": "invalid_request",
  "message": "Validation failed on the request.",
  "data": {
    "validator_errors": [
      {
        "path": "retailer_credentials.password",
        "message": "'undefined' is not a permitted value for 'retailer_credentials.password' field."
      },
      {
        "path": "retailer_credentials.email",
        "message": "'undefined' is not a permitted value for 'retailer_credentials.email' field."
      },
      {
        "path": "shipping_method",
        "message": "'undefined' is not a permitted value for 'shipping_method' field."
      },
      {
        "path": "is_gift",
        "message": "'undefined' is not a permitted value for 'is_gift' field."
      },
      {
        "path": "shipping_address.phone_number",
        "message": "'undefined' is not a permitted value for 'shipping_address.phone_number' field."
      },
      {
        "path": "shipping_address.country",
        "message": "'undefined' is not a permitted value for 'shipping_address.country' field."
      },
      {
        "path": "shipping_address.city",
        "message": "'undefined' is not a permitted value for 'shipping_address.city' field."
      },
      {
        "path": "shipping_address.zip_code",
        "message": "'undefined' is not a permitted value for 'shipping_address.zip_code' field."
      },
      {
        "path": "shipping_address.address_line1",
        "message": "'undefined' is not a permitted value for 'shipping_address.address_line1' field."
      },
      {
        "path": "shipping_address.last_name",
        "message": "'undefined' is not a permitted value for 'shipping_address.last_name' field."
      },
      {
        "path": "shipping_address.first_name",
        "message": "'undefined' is not a permitted value for 'shipping_address.first_name' field."
      },
      {
        "path": "retailer",
        "message": "'undefined' is not a permitted value for 'retailer' field."
      },
      {
        "path": "client_token",
        "message": "'undefined' is not a permitted value for 'client_token' field."
      },
      {
        "value": [],
        "path": "products",
        "message": "'' is not a permitted value for 'products' field."
      }
    ]
  },
  "host": "zincapi-1",
  "offers_urls": [],
  "screenshot_urls": [],
  "_created_at": "2015-10-18T17:54:13.416Z"
}

My code is in the index view as:

<table>
  <thead>
    <tr>
      <th>IF name</th>
      <th colspan="3"></th>
    </tr>
  </thead>

  <tbody>
<% @ifs.each do |t| %>

<!-- Update Each cur_count -->

  <%
  require 'json'
  require 'HTTParty'


  zincUrl = 'https://api.zinc.io/v0/order'
  @ZincResult=HTTParty.post(zincUrl,
    :body => [{
      :client_token => "XXXXXXXX",
  :retailer => "amazon",
  :products => [{"product_id" => ""+t.item+"", "quantity" => 1,
  "seller_selection_criteria" => [
      {
        "condition_in" => ["New"],
        "international" => false,
        "max_shipping_days" => 10
      }
    ]
    }],
  :max_price => 2000,
  :shipping_address => {
  "first_name" => "name",
  "last_name" => "name",
  "address_line1" => "address",
  "address_line2" => "",
  "zip_code" => "94133",
  "city" => "San Francisco",
  "state" => "CA",
  "country" => "US",
  "phone_number" => "number"
  },
  :is_gift => true,
  :gift_message => "present",
  :shipping_method => "cheapest",
  :payment_method => {
  "name_on_card" => "name",
  "number" => "XXXXXXXX",
  "security_code" => "XXX",
  "expiration_month" => "XX",
  "expiration_year" => "XXXX",
  "use_gift" => false
  },
  :billing_address => {
  "first_name" => "name",
  "last_name" => "name",
  "address_line1" => "address",
  "address_line2" => "",
  "zip_code" => "94133",
  "city" => "San Francisco",
  "state" => "CA",
  "country" => "US",
  "phone_number" => "XXXXXXXX"
  },
  :retailer_credentials => {
  "email" => "email",
  "password" => "password"
  },
  :webhooks => {
  "order_placed" => "http://mywebsite.com/zinc/order_placed",
  "order_failed" => "http://mywebsite.com/zinc/order_failed",
  "tracking_obtained" => "http://mywebsite.com/zinc/tracking_obtained"
  },
  :client_notes => {
  "our_internal_order_id" => "Order_"+t.item+"",
  }
  }].to_json,

    :headers => { 'Content-Type' => 'application/json' } )

  %>

  <%puts "end of Zinc if loop"%>

  <%puts @ZincResult%>

<tr>
  <td><%= t.name %>  </td>
  <td><%= t.item %></td>
  <td><%= t.key %></td>
  <td><%= t.count %></td>
  <td><%= t.cur_count %></td>

  <td><%= link_to 'show', if_path(t) %></td>

  <td><%= link_to 'edit', edit_if_path(t.id) %></td>

  <td><%= link_to 'delete', ifs_delete_path(:id =>t.id)%></td>

</tr>
<% end %>
</tbody>
</table>

Upvotes: 0

Views: 1345

Answers (1)

Abdulrazak Alkl
Abdulrazak Alkl

Reputation: 923

According to Zinc Docs you should send json object in body but you are sending json array. To send JSON Object, you should start your body with curly braces "{}" and not square brackets "[]"

@ZincResult=HTTParty.post(zincUrl,
    :body => {.........}.to_json,
    :headers => { 'Content-Type' => 'application/json' } )

Upvotes: 3

Related Questions