Rails ve HTTParty kullanarak JSON'u API'ye POST


106

Ruby on rails uygulamamdaki bir kullanıcının harici bilet yönetim sistemim olan squishlist.com'a bir bilet gönderebilmesini istiyorum. Aşağıdaki gibi bir api ve talimatları var. Bir jetonu doğrulamanız ve bir jeton almanız ve ardından bileti jetonla birlikte göndermeniz gerekir. Squishlist'ten.

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

Test amacıyla, test için bir kontrolör, yol ve görünüm (sayfa) oluşturdum. Kumandamda aşağıdakiler var

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

Ve sonra denetleyicilerin eylemlerinin sonucunu görmek için gittiğim bir sayfam var ve aşağıdaki koda sahip.

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

Yol boyunca aldığım yanıtlar nedeniyle genel olarak işe yaradığını biliyorum. Squishlist'te tanımladığım alanlar nedeniyle json'um örnekten farklı. Bu konuda bana yardımcı olabilecek biri var mı?

Sanırım asıl sorun, json'un neye benzediğini ve hatta eşleşmeye yakın olup olmadığını gerçekten görememem. JSON hakkında gerçekten pek bir şey bilmiyorum. Kolay olabilecek bir şey kullanmalı mıyım? Bunu göndermek için ajax kullanmalı mıyım? Herhangi bir yardım çok takdir edilmektedir. Buradaki topluluğu seviyorum.

Yanıtlar:


258

Bunu .to_jsonve bazı başlık bilgileri ekleyerek çözdüm

@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
ayrıca, "GitLab API" gibi bazı API'ler "Kabul Et" başlığına duyarlıdır. Yani başlık olmalıdır :headers => { 'Content-Type' => 'application/json', 'Accept' => 'application/json'}. Not: başlık
JSON'a

Raylarda API'lerde hata ayıklamak için gerçekten yararlı olan bir Rails motoru (bir mücevher olarak paketlenmiş) kurdum. Görmek için motoru monte etmeniz ve belirttiğiniz url'ye gitmeniz yeterlidir, yani "localhost: 3000 / api_explorer". Ayrıca, bir dosyadan web hizmetleri özelliklerini okuyarak, bir API belgelemenin bir yoludur. Gem 'api_explorer' olarak adlandırılır ve repo ise github.com/toptierlabs/api_explorer'dir API'yi iyileştirmek için herhangi bir yorum veya yardıma açığız. :)
Tony

6
Bunun belgelerde olmaması aptalca.
Tyler Collier

Teşekkürler! Bu harika çalıştı! Yine de soru: JSON dizisini nasıl dahil edersiniz?
Ruben Martinez Jr.

1
Toplama verilerini yukarıdaki formatta olduğu gibi 90 bin kayıt gibi aktarmak istiyorsanız. Tüm verileri tek bir API çağrısında aktarabilir miyim? lütfen yorumlarınızı bana bildirin
Raju akula

14

:query_string_normalizerSeçenek varsayılan normalleyici geçersiz kılar, hangi da mevcutturHashConversions.to_params(query)

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

Harika! Bu, karmanın saklanmasına request.options[:body]ancak doğru dizenin gönderilmesine izin verir . Sorunun gerçek cevabı bu olmalı.
freemanoid

Seçenek ayrıca, query_string_normalizer sınıf yöntemiyle HTTParty dahil sınıfta varsayılan olarak ayarlanabilir, bkz: ruby-doc.org/gems/docs/h/httparty2-0.7.10/HTTParty/…
Fryie

İçerik türü üstbilgisini ayarlamak da gerekli olabilir: ruby-doc.org/gems/docs/h/httparty2-0.7.10/HTTParty/…
Fryie

1
query_string_normalizerveri göndermek için değil sorgu dizeleri için kullanılmalıdır.
josephrider

Bağlantılar kesildiruby-doc.org , dokümantasyon httparty doc
yacc
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.