POST JSON do API przy użyciu Railsów i HTTParty

106

Chciałbym, aby użytkownik w mojej aplikacji Ruby on Rails mógł przesłać zgłoszenie do mojego zewnętrznego systemu zarządzania biletami, squishlist.com. Mają interfejs API i instrukcje w następujący sposób. Musisz uwierzytelnić się i uzyskać token, a następnie przesłać bilet z tokenem. Z listy 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}

Do celów testowych stworzyłem kontroler, trasę i widok (stronę) do testowania. Na moim kontrolerze mam następujące

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

A potem mam stronę, do której przechodzę, aby zobaczyć wyniki działań kontrolerów i ma następujący kod.

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

Wiem, że ogólnie działa, dzięki odpowiedziom, które otrzymałem po drodze. Mój plik json różni się od przykładu z powodu pól, które zdefiniowałem w squishlist. Czy ktoś może mi pomóc w tej sprawie?

Myślę, że prawdziwym problemem jest to, że naprawdę nie mogę zobaczyć, jak wygląda json i czy jest nawet blisko dopasowania. Naprawdę niewiele wiem o JSON. Czy powinienem użyć czegoś, co mogłoby być łatwe. Czy powinienem używać ajax, aby to przesłać. Każda pomoc jest mile widziana. Uwielbiam tę społeczność.

Homer Jon
źródło

Odpowiedzi:

258

Rozwiązałem to, dodając .to_jsoni trochę informacji o nagłówkach

@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
źródło
9
również niektóre interfejsy API, takie jak „GitLab API”, są wrażliwe na nagłówek „Accept”. Więc nagłówek powinien być :headers => { 'Content-Type' => 'application/json', 'Accept' => 'application/json'}. Uwaga: nagłówek nie powinien być konwertowany do JSON, oczekuje się, że będzie to skrót
Devaroop
Wdrożyłem silnik Rails (zapakowany jako klejnot), który jest naprawdę przydatny do debugowania API na railsach. Aby go zobaczyć, wystarczy zamontować silnik i przejść do podanego adresu URL, np. „Localhost: 3000 / api_explorer”. Jest to również sposób na udokumentowanie interfejsu API, odczyt specyfikacji usług sieciowych z pliku. Klejnot nosi nazwę „api_explorer”, a repozytorium to github.com/toptierlabs/api_explorer Wszelkie komentarze lub pomoc w ulepszaniu interfejsu API są mile widziane. :)
Tony
6
To po prostu głupie, że nie ma tego w dokumentacji.
Tyler Collier
Dzięki! To działało świetnie! Pytanie jednak: w jaki sposób można dołączyć tablicę JSON?
Ruben Martinez Jr.
1
Chcesz przesłać dane kolekcji, takie jak rekordy 90 tys., Jak w powyższym formacie. Czy mogę przesłać całe dane w jednym wywołaniu interfejsu API? proszę dać mi znać swoje komentarze
Raju akula
14

Dostępna :query_string_normalizerjest również opcja, która zastąpi domyślny normalizatorHashConversions.to_params(query)

query_string_normalizer: ->(query){query.to_json}
Brian McNabb
źródło
Niesamowite! Pozwala to na przechowywanie skrótu, request.options[:body]ale wysyłanie poprawnego ciągu. To powinna być prawdziwa odpowiedź na to pytanie.
freemanoid
Opcję można również ustawić jako domyślną w klasie, w tym HTTParty z metodą klasy query_string_normalizer, patrz: ruby-doc.org/gems/docs/h/httparty2-0.7.10/HTTParty/ ...
Fryie
Konieczne może być również ustawienie nagłówka typu zawartości: ruby-doc.org/gems/docs/h/httparty2-0.7.10/HTTParty/ ...
Fryie
1
query_string_normalizerpowinien być używany do ciągów zapytań, a nie do przesyłania danych.
josephrider
Linki do ruby-doc.orgsą martwe, dokumentacja jest na httparty doc
yacc