I am trying to call a URL using Ruby's OpenURI gem, however it needs me to pass certain values inside its HTTP request header.
Any idea how to do this?
According to the documentation, you can pass a hash of http headers as the second argument to open:
open("http://www.ruby-lang.org/en/",
"User-Agent" => "Ruby/#{RUBY_VERSION}",
"From" => "foo#bar.invalid",
"Referer" => "http://www.ruby-lang.org/") {|f|
# ...
}
Related
require 'rubygems'
require 'rest_client'
response = RestClient.post "URL",
"myfile" => File.new("/path/to/file"),
"Cookie" => "Name=michal",
"X-SESSION-ID" => "dsafasdfadsfadsfasfdadf",
"User-Agent" => "UNknow",
"connection" => "Keep-Alive"
If I try to use the above code to post a file then the headers Cookie,User-Agent,X-SESSION-ID never gets set on the request that is send out... i confirmed it using wireshark
What am i doing wrong ?
RestClient tries to be smart when it detects a file and treat the remaining arguments as other parts in the multipart request. So you just need to separate the content from the headers by change it into a hash.
Try this:
response = RestClient.post "URL",
{"myfile" => File.new("/path/to/file")},
"Cookie" => "Name=michal",
"X-SESSION-ID" => "dsafasdfadsfadsfasfdadf",
"User-Agent" => "UNknow",
"connection" => "Keep-Alive"
I'm losing my sanity trying to parse an incoming request on a Sinatra app.
This is my spec
payload = File.read("./spec/support/fixtures/payload.json")
post "/api/v1/verify_payload", { :payload => payload }
last_response.body.must_equal payload
where is simply spec/support/fixtures/payload.json
{"ref":"refs/heads/master"}
My route looks like
post '/verify_payload' do
params = MultiJson.load(request.body.read, symbolize_keys: true)
params[:payload]
end
And running the spec I get the following error:
MultiJson::LoadError: 795: unexpected token at 'payload=%7B%22ref%22%3A%22refs%2Fheads%2Fmaster%22%7D'
I have tried to parse the body request in different ways without luck.
How can I make the request valid JSON?
THANKS
If you want to send a JSON-encoded POST body, you have to set the Content-Type header to application/json. With Rack::Test, you should be able to do this:
post "/api/v1/verify_payload", payload, 'CONTENT_TYPE' => 'application/json'
Alternatively:
header 'Content-Type' => 'application/json'
post '/api/v1/verify_payload'
More info here: http://www.sinatrarb.com/testing.html
The problem it is that you are passing a ruby hash, that is not well formated, you should pass a json object.
Something like this, should work:
post "/api/v1/verify_payload", { :payload => payload.to_json }
I am making the following API GET request, using ruby 1.9.3 and the httparty gem:
uri= HTTParty.post("www.surveys.com/api/v2/contacts",
:basic_auth => auth,
:headers => { 'ContentType' => 'application/json' },
:body => {
"custom_test" => test,
"name" => firstname,
"email" => emailaddress
}
)
The variables auth,test,firstname, and emailaddress are valid. This is the response I am receiving back from my request:
{
"code": "invalid_json",
"description": "Request sent with Content-Type: application/json but was unable to decode request body as valid json.",
"success": false
}
500
#<Net::HTTPInternalServerError:0x007fe4eb98bde0>
What is wrong with the way I am posting this JSON request?
EDIT: It's probably worth noting that the API allows you to define custom attributes to a contact, hence the "custom_test" attribute in the body.
Since you are receiving an internal server error (500) instead of a not accepted (406), most likely there is coding problem on the server, because an exception that he is not expecting is happening instead of delivery to you a nice error explaining what is wrong (and this would be my first guess).
But let's say it is a problem with the JSON communication. Maybe you have to specify that you are accepting json format?
Try
:headers => { 'ContentType' => 'application/json', 'Accept' => 'application/json' },
Accept header definition from w3:
The Accept request-header field can be used to specify certain media types which are acceptable for the response. Accept headers can be used to indicate that the request is specifically limited to a small set of desired types, as in the case of a request for an in-line image.
And content-type header definition:
The Content-Type entity-header field indicates the media type of the entity-body sent to the recipient or, in the case of the HEAD method, the media type that would have been sent had the request been a GET.
You're sending a regular HTTP query string while saying it's json.
From HTTParty manual: "body: The body of the request. If it‘s a Hash, it is converted into query-string format, otherwise it is sent as-is."
Try:
:body => JSON.generate({
"custom_test" => test,
"name" => firstname,
"email" => emailaddress
})
You need to require 'JSON'
I have the following Curl command that works:
curl -H "Authorization:GoogleLogin auth=xxx" http://www.google.com/reader/api/0/user-info
I'm trying to do this via a get in BubbleWrap HTTP:
HTTP.get("http://www.google.com/reader/api/0/user-info",
{
:headers => { "Authorization:GoogleLogin auth" => "xxx"}
}) do |response|
puts response
puts response.body.to_str
end
But I get a 401 back so maybe I didn't set the header correctly?
The header name is supposed to be Authorization with a value of GoogleLogin auth=xxx. The way you're doing it, it's a header name of Authorization:GoogleLogin auth with a value of xxx. Try this instead:
:headers => {"Authorization" => "GoogleLogin auth=xxx"}
I'm trying to make a POST request using HTTParty, in which I need the content-type to be text/xml. How can I make that happen? Right now the API I'm calling is complaining I'm not sending any xml. If I call it using curl I get the same error, unless I specify content-type to text/xml.
HTTParty.post url, :body => xml, :headers => {'Content-type' => 'text/xml'}