POST JSON ke API menggunakan Rails dan HTTParty

106

Saya ingin pengguna dalam aplikasi ruby ​​on rails saya dapat mengirimkan tiket ke sistem manajemen tiket eksternal saya, squishlist.com. Mereka memiliki api dan instruksi sebagai berikut. Anda perlu mengautentikasi dan mendapatkan token lalu mengirimkan tiket dengan token tersebut. Dari squishlist.

# 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}

Untuk tujuan pengujian, saya membuat pengontrol, rute dan tampilan (halaman) untuk pengujian. Pada pengontrol saya, saya memiliki yang berikut ini

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

Dan kemudian saya memiliki halaman yang saya buka untuk melihat hasil dari tindakan pengontrol dan memiliki kode berikut.

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

Saya tahu bahwa ini berfungsi secara umum karena tanggapan yang saya terima selama ini. Json saya berbeda dari contoh karena bidang yang telah saya tetapkan dalam daftar squish. Adakah yang bisa membantu saya dalam masalah ini?

Saya kira masalah sebenarnya adalah saya tidak bisa benar-benar melihat seperti apa json itu dan apakah itu bahkan hampir cocok. Saya benar-benar tidak tahu banyak tentang json. Haruskah saya menggunakan sesuatu yang mungkin mudah. Haruskah saya menggunakan ajax untuk mengirimkan ini. Bantuan apa pun sangat dihargai. Saya suka komunitas di sini.

Homer Jon
sumber

Jawaban:

257

Saya menyelesaikan ini dengan menambahkan .to_jsondan beberapa informasi heading

@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' } )
Homer Jon
sumber
9
juga, beberapa API seperti "GitLab API" sensitif terhadap header "Terima". Jadi headernya harus :headers => { 'Content-Type' => 'application/json', 'Accept' => 'application/json'}. Catatan: header tidak boleh dikonversi ke JSON, ini diharapkan menjadi hash
Devaroop
Saya menerapkan mesin Rails (dikemas sebagai permata) yang sangat berguna untuk men-debug API di rel. Anda hanya perlu me-mount mesin dan pergi ke url yang Anda tentukan, yaitu "localhost: 3000 / api_explorer" untuk melihatnya. Ini juga merupakan cara mendokumentasikan API, membaca spesifikasi layanan web dari file. Permata itu bernama 'api_explorer' dan repo-nya adalah github.com/toptierlabs/api_explorer. Setiap komentar atau bantuan untuk meningkatkan api dipersilakan. :)
Tony
6
Konyol sekali bahwa itu tidak ada dalam dokumentasi.
Tyler Collier
Terima kasih! Ini bekerja dengan baik! Namun, pertanyaannya: bagaimana Anda menyertakan array JSON?
Ruben Martinez Jr.
1
Ingin mendorong pengumpulan data seperti catatan 90k seperti dalam format di atas. Dapatkah saya memasukkan seluruh data dalam satu panggilan API? tolong beritahu saya komentar Anda
Raju akula
13

The :query_string_normalizerpilihan juga tersedia, yang akan menimpa normalizer bawaanHashConversions.to_params(query)

query_string_normalizer: ->(query){query.to_json}
Brian McNabb
sumber
Hebat! Ini memungkinkan untuk menyimpan hash request.options[:body]tetapi mengirim string yang benar. Ini harus menjadi jawaban sebenarnya untuk pertanyaan itu.
freemanoid
Opsi ini juga dapat disetel sebagai default di kelas termasuk HTTParty dengan metode kelas query_string_normalizer, lihat: ruby-doc.org/gems/docs/h/httparty2-0.7.10/HTTParty/…
Fryie
Mungkin juga diperlukan untuk mengatur header jenis konten: ruby-doc.org/gems/docs/h/httparty2-0.7.10/HTTParty/…
Fryie
1
query_string_normalizerharus digunakan untuk string kueri, bukan data posting.
josephrider
Tautan ke ruby-doc.orgsudah mati, dokumentasinya ada di httparty doc
yacc