POST JSON в API за допомогою Rails та HTTParty


106

Я хотів би, щоб користувач у моїй програмі «Рубін на рейках» міг подати квиток у мою зовнішню систему управління квитками, squishlist.com. У них є api та інструкції наступним чином. Потрібно пройти автентифікацію та отримати маркер, а потім подати квиток із жетоном. Із списку.

# get the token

https://api.squishlist.com/auth/?cfg=testcorp&user_key=privatekey&api_key=TEST-KEY-12345
  => {"token": "authtoken",
      "expires": "2010-06-16 13:31:56"}

# and then the ticket with the token

https://api.squishlist.com/rest/?cfg=testcorp&token=authtoken&method=squish.issue.submit&prj=demo
  POST data: {'issue_type': 1, 'subject': 'Hello, world.', 4: 'Open', 5: 10}

Для тестування я створив контролер, маршрут і вигляд (сторінку) для тестування. У мене на контролері є наступне

require 'httparty'
require 'json'

class SubmitticketController < ApplicationController

    def submit_a_ticket

        @cfg = 'xxxsupport'
        @user_key = '4787fsdbbfbfsdbhbfad5aba91129a3f1ed1b743321f7b'
        @api_key = 'MrUser411'
        @project = 'excelm-manoke'
        @url_new_string = 'https://api.squishlist.com/auth/?cfg='+@cfg+'&user_key='+@user_key+'&api_key='+@api_key
        # https://api.squishlist.com/auth/?cfg=xxxsupport&user_key=4787fsdbbfbfsdbhbfad5aba91129a3f1ed1b743321f7b&api_key=MrUser411  - this is what is created by @url_new_string
        response =  HTTParty.get(@url_new_string.to_str)  #submit the string to get the token
        @parsed_and_a_hash = JSON.parse(response)
        @token = @parsed_and_a_hash["token"]


        #make a new string with the token

        @urlstring_to_post = 'https://api.squishlist.com/rest/?cfg='+@cfg+'&token='+@token+'&method=squish.issue.submit&prj='+@project

        #submit and get a result

        @result = HTTParty.post(@urlstring_to_post.to_str, :body => {:subject => 'This is the screen name', :issue_type => 'Application Problem', :status => 'Open', :priority => 'Normal', :description => 'This is the description for the problem'})

    end

end

І тоді у мене є сторінка, на яку я переходжу, щоб побачити результат дій контролерів, і на ній є наступний код.

<p><%= @result %></p>

Я знаю, що це працює взагалі через відповіді, які я отримав попутно. Мій json відрізняється від прикладу тим, що поля, які я визначив у списку. Хтось може мені допомогти з цього питання?

Я думаю, що справжня проблема полягає в тому, що я не можу реально побачити, як виглядає json, і якщо він навіть близький. Я справді мало знаю про json. Чи варто використовувати щось, що може бути простим. Чи слід використовувати Ajax, щоб подати це. Будь-яка допомога дуже вдячна. Я люблю громаду тут.

Відповіді:


257

Я вирішив це, додавши .to_jsonінформацію про заголовок

@result = HTTParty.post(@urlstring_to_post.to_str, 
    :body => { :subject => 'This is the screen name', 
               :issue_type => 'Application Problem', 
               :status => 'Open', 
               :priority => 'Normal', 
               :description => 'This is the description for the problem'
             }.to_json,
    :headers => { 'Content-Type' => 'application/json' } )

9
також деякі API, такі як "GitLab API", чутливі до заголовка "Прийняти". Так має бути заголовок :headers => { 'Content-Type' => 'application/json', 'Accept' => 'application/json'}. Примітка: заголовок не повинен бути перетворений на JSON, очікується, що він буде хеш
Devaroop

Я розгорнув двигун Rails (упакований як дорогоцінний камінь), який дуже корисний для налагодження API на рейках. Вам просто потрібно встановити двигун і перейти до вказаного вами URL-адреси, тобто "localhost: 3000 / api_explorer", щоб побачити його. Це також спосіб документування API, зчитування специфікації веб-сервісів з файлу. Самоцвіт названий "api_explorer", а репортаж - github.com/toptierlabs/api_explorer Будь-які коментарі чи допомога в покращенні api вітаються. :)
Тоні

6
Просто нерозумно, що цього немає в документації.
Тайлер Колліер

Дякую! Це спрацювало чудово! Однак питання: як би ви включили масив JSON?
Рубен Мартінес-молодший

1
Хочете підштовхнути дані колекції, такі як записи в 90 тис., Як у наведеному вище форматі. Чи можна натискати цілі дані в одному дзвінку API? будь ласка, повідомте мені ваші коментарі
Raju akula

14

:query_string_normalizerОпція також доступна, який перепише нормалізатор за замовчуваннямHashConversions.to_params(query)

query_string_normalizer: ->(query){query.to_json}

Дивовижно! Це дозволяє зберігати хеш, request.options[:body]але надсилати правильний рядок. Це має бути реальною відповіддю на питання.
freemanoid

Цей параметр також може бути встановлений за замовчуванням у класі, включаючи HTTParty, методом класу query_string_normalizer, див.: Ruby-doc.org/gems/docs/h/httparty2-0.7.10/HTTParty/…
Fryie

Також може знадобитися встановити заголовок типу вмісту: ruby-doc.org/gems/docs/h/httparty2-0.7.10/HTTParty/…
Fryie,

1
query_string_normalizerслід використовувати для рядків запитів, а не для публікації даних.
Йозефридер

Посилання на ruby-doc.orgмертві, документація знаходиться на httparty doc
yacc
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.