POST JSON to API using Rails and HTTParty
Solution 1
I solved this by adding .to_json
and some heading information
@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' } )
Solution 2
The :query_string_normalizer
option is also available, which will override the default normalizer HashConversions.to_params(query)
query_string_normalizer: ->(query){query.to_json}
Related videos on Youtube
Homer Jon
Updated on July 08, 2022Comments
-
Homer Jon almost 2 years
I would like for a user within my ruby on rails app to be able to submit a ticket to my external ticket management system, squishlist.com. They have an api and instructions as follows. You need to authenticate and get a token and then submit the ticket with the token. From 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}
For testing purposes, I created a controller, route and view (page) for testing. On my controller I have the following
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
And then I have a page that I go to to see the result of the controllers actions and it has the following code.
<p><%= @result %></p>
I know that it is working in general because of responses I have received along the way. My json is different from the example because of fields I have defined in squishlist. Can anyone help me out on this issue?
I guess the real problem is that I can't really see what the json looks like and if it is even close to match. I really don't know much about json. Should I be using something that might be easy. Should I be using ajax to submit this. Any help is greatly appreciated. I love the community here.
-
freemanoid over 10 yearsAwesome! This allows to store the hash in
request.options[:body]
but send the correct string. This should be the real answer to the question. -
Devaroop over 10 yearsalso, some APIs like the "GitLab API" is sensetive to "Accept" header. So the header should be
:headers => { 'Content-Type' => 'application/json', 'Accept' => 'application/json'}
. Note: the header should not be converted to JSON, it is expected to be an hash -
Tony over 10 yearsI deployed a Rails engine (packed as a gem) that is really useful to debug APIs on rails. You just have to mount the engine and go to the url that you specified, i.e. “localhost:3000/api_explorer” to see it. It’s a way of documenting an API also, reading the webservices specification from a file. The gem is named ‘api_explorer’ and the repo is github.com/toptierlabs/api_explorer Any comments or help improving the api is welcome. :)
-
Tyler Collier almost 10 yearsIt's just silly that that's not in the documentation.
-
Ruben Martinez Jr. over 9 yearsThanks! This worked great! Question, though: how would you include a JSON array?
-
Fryie over 9 yearsThe option can also be set as a default in the class including HTTParty with the query_string_normalizer class method, see: ruby-doc.org/gems/docs/h/httparty2-0.7.10/HTTParty/…
-
Fryie over 9 yearsIt may also be necessary to set the content-type header:ruby-doc.org/gems/docs/h/httparty2-0.7.10/HTTParty/…
-
Raju akula about 9 yearsWant to push collection data like 90k records like in above format. Can I push entire data in single API call? please let me know your comments
-
josephrider almost 9 years
query_string_normalizer
should be used for query strings, not post data. -
Yacc over 8 yearsThe links to
ruby-doc.org
are dead, the documentation is at httparty doc -
user9869932 over 2 yearsThe
.to_json
attached to:body => {}.to_json
fixed my errors with this call.