RailsとHTTPartyを使用してJSONをAPIにPOSTする


106

Ruby on Railsアプリ内のユーザーが外部のチケット管理システム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は、私がsquishlistで定義したフィールドがあるため、例とは異なります。誰かがこの問題を手伝ってくれる?

私の本当の問題は、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
また、「GitLab API」などの一部のAPIは「Accept」ヘッダーに影響します。したがって、ヘッダーはになります:headers => { 'Content-Type' => 'application/json', 'Accept' => 'application/json'}。注:ヘッダーはJSONに変換しないでください。これはハッシュであることが期待されています
Devaroop

RailsでAPIをデバッグするのに本当に役立つRailsエンジン(gemとしてパック)をデプロイしました。エンジンをマウントし、指定したURL、つまり「localhost:3000 / api_explorer」に移動してそれを表示するだけです。これは、APIを文書化する方法でもあり、ファイルからwebservices仕様を読み取ります。宝石の名前は「api_explorer」で、リポジトリはgithub.com/toptierlabs/api_explorerです。APIのコメントやAPIの改善にご協力ください。:)
Tony

6
それがドキュメントにないのはばかげています。
タイラーコリアー2014年

ありがとう!これはうまくいきました!ただし、質問:JSON配列はどのように含めますか?
ルーベンマルティネスジュニア

1
上記のフォーマットのように、9万件のレコードのような収集データをプッシュしたい。1回のAPI呼び出しでデータ全体をプッシュできますか?コメントを教えてください
Raju akula 2015

13

:query_string_normalizerオプションはデフォルトの正規化を無効になる、も可能ですHashConversions.to_params(query)

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

驚くばかり!これにより、ハッシュを保存できますrequest.options[:body]が、正しい文字列を送信できます。これが質問に対する本当の答えになるはずです。
freemanoid 2013

また、参照、HTTParty query_string_normalizerクラスのメソッドを含むクラスのデフォルトとして設定することができますオプション:ruby-doc.org/gems/docs/h/httparty2-0.7.10/HTTParty/...
Fryie

:また、Content-Typeヘッダに設定する必要があるかもしれruby-doc.org/gems/docs/h/httparty2-0.7.10/HTTParty/...
Fryie

1
query_string_normalizer投稿データではなく、クエリ文字列に使用する必要があります。
ジョセフライダー2015年

へのリンクruby-doc.org無効です。ドキュメント
yacc
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.