How to convert a CURL request to Ruby Gem HTTPClient - ruby-on-rails

I am trying to convert this CURL request:
curl \
-F 'slideshow_spec={
"images_urls": [
"<IMAGE_URL_1>",
"<IMAGE_URL_2>",
"<IMAGE_URL_3>"
],
"duration_ms": 2000,
"transition_ms": 200
}' \
-F 'access_token=<ACCESS_TOKEN>' \
https://google.com
To a HTTPClient request but all my attempts results in 400 Bad Request. Here's what I've tried:
payload = {
"images_urls": [
"https://cdn-m2.esoftsystems.com/10100028/TAASTRUP%40DANBOLIG.DK/10106239925/160596797/BEST_FIT/1542/1024/IMG_5511.jpg",
"https://cdn-m2.esoftsystems.com/10100028/TAASTRUP%40DANBOLIG.DK/10106239925/160596797/BEST_FIT/1542/1024/IMG_5511.jpg",
"https://cdn-m2.esoftsystems.com/10100028/TAASTRUP%40DANBOLIG.DK/10106239925/160596797/BEST_FIT/1542/1024/IMG_5511.jpg"
],
"duration_ms": 2000,
"transition_ms": 200
}
response = RestClient.post url, {slideshow_spec: payload.to_json, multipart: true, access_token: access_token}
Any ideas?

Your requests are not equivalent. I guess you are mixing JSON, Multipart and x-www-form-urlencoded formats here.
RestClient supports all three formats (examples taken from https://github.com/rest-client/rest-client/blob/master/README.md)
# POST JSON
RestClient.post "http://example.com/resource", {'x' => 1}.to_json, {content_type: :json, accept: :json}
# POST Multipart
# Usually not needed if you don't want to upload a file
RestClient.post '/data', {:foo => 'bar', :multipart => true}
# POST x-www-form-urlencoded
RestClient.post('https://httpbin.org/post', {foo: 'bar', baz: 'qux'})
Looks like your curl sample uses application/x-www-form-urlencoded, while your Ruby sample uses multipart/form-data.
For some background information, check
https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST
https://dev.to/sidthesloth92/understanding-html-form-encoding-url-encoded-and-multipart-forms-3lpa

Related

Showing 400 bad request when try to post file via rest API with Ruby

I'm try to post a file using RestClient with Ruby on rails, I have try to conver below curl command:
curl -H 'Authorization: Bearer ACCESS_TOKEN' -F 'file=#FILE_PATH' https://api.com/api
When converting with RestClient like below:
res = RestClient::Request.new(
method: :post,
url: 'https://api.com/api',
:payload => {
:file => File.new("#{Rails.root}/public/Sample.docx" , 'rb')
},
:headers => {
:Authorization => "Bearer 155c5e5c4feea51b386fdfe204abc60b7f4025fb91988519de869525217b4702",
:content_type => "multipart/form-data"
}
)
res.execute
On this code showing 400 Bad Request
What I'm doing wrong with this code?
Thanks
Your post is a duplicate of this one Ruby - Uploading a file using RestClient post
In your case, try changing content_type to application/vnd.openxmlformats-officedocument.wordprocessingml.document
List of MIME types can be found here: What is a correct mime type for docx, pptx etc?

curl post request in rails controller

I want to convert this post request written in curl (GoPay payment gateway) to my Rails application:
curl -v https://gw.sandbox.gopay.com/api/oauth2/token \
-X "POST" \
-H "Accept: application/json" \
-H "Content-Type: application/x-www-form-urlencoded" \
-u "<Client ID>:<Client Secret>" \
-d "grant_type=client_credentials&scope=payment-create"
I am trying to do in my rails controller by using a gem rest-client. I've done something like this and was modifiying many times but couldn't make it works:
RestClient::Request.execute( method: :post,
url: "https://gw.sandbox.gopay.com/api/oauth2/token",
"#{ENV['GOPAY_CLIENT_ID']}": "#{ENV['GOPAY_CLIENT_SECRET']}"
data: "grant_type=client_credentials&scope=payment-create"
)
How I can convert the curl post request for the rest-client (or similar)?
EDIT: It is showing a status code 409: Conflict with no further information
EDIT1 - rgo's modified code works, thank you:
RestClient.post "https://#{ENV['GOPAY_CLIENT_ID']}:#{ENV['GOPAY_CLIENT_SECRET']}#gw.sandbox.gopay.com/api/oauth2/token",
{ grant_type: 'client_credentials', scope: 'payment-create'},
content_type: :json, accept: :json
I'm not a RestClient user but after reading the documentation[1] I think I transformed your cURL request to RestClient:
RestClient.post "http://#{ENV['GOPAY_CLIENT_ID']}:#{ENV['GOPAY_CLIENT_SECRET']}#https://gw.sandbox.gopay.com/api/oauth2/token",
{ grant_type: 'client_credentials', scope: 'payment-create'},
content_type: :json,
accept: :json
As you can see I pass the credentials in the URL because is a basic authentication. Data(grant_type and scope) is passed as hash and then converted to JSON. Then we set rest client to send and receive JSON.
I hope it helps you
[1] https://github.com/rest-client/rest-client#usage-raw-url
You didn't mention exactly what doesn't work or what error you're seeing. However, the -u option for curl is used to pass the username and password for basic authentication.
The equivalent for RestClient is to use the user and password options e.g.
RestClient::Request.execute(
method: :post,
url: "https://gw.sandbox.gopay.com/api/oauth2/token",
user: "#{ENV['GOPAY_CLIENT_ID']}",
password: "#{ENV['GOPAY_CLIENT_SECRET']}"
data: "grant_type=client_credentials&scope=payment-create",
headers: { "Accept" => "application/json", "Content-Type" => "application/x-www-form-urlencode" }
)

curl request in ruby RestClient

The fastbill API states in its docu to make this curl request in order to receive information:
curl -v -X POST \
–u {E-Mail-Adresse}:{API-Key} \
-H 'Content-Type: application/xml' \
-d '{xml body}' \
https://my.fastbill.com/api/1.0/api.php
Using RestClientI tried to translate this into a ruby like request:
How I read this:
- make a post request to https://my.fastbill.com/api/1.0/api.php using basic authentification and stating the content type in the header, correct?
Now this would be a resource based request in RestClient like this:
First I authenticate:
resource = RestClient::Resource.new( 'https://my.fastbill.com/api/1.0/api.php', 'my#email.de', 'API-KEY-XXXXX' )
which works and authorises me.
then putting my request in:
xml = '<?xml version="1.0" encoding="utf-8"?><FBAPI><SERVICE>customer.get</SERVICE><FILTER/></FBAPI>'
resource.post xml, content_type: 'application/xml'
It always returns 400 and I don't know what else to do here.
Also how would json work here?
resource.post param1: 'value', content_type: 'json'
would be obvious.
You can utilize the Restclient::Request.execute. 400 errors typically indicate that the request was not understood by the recipeint. This could be caused by the headers or malformed data. You may need to add the accept header. Try the example below
require 'rest_client'
RestClient::Request.execute(
method: :post,
user: 'api_user#example.com',
password: 'pass123',
url: "https://example/users.json",
headers: {content_type: :json, accept: :json},
payload: { 'user' => { 'name' => 'John Doe', 'email' => 'john.doe#example.com'} }.to_json,
)
You can find a detailed list of options here
$url="https://my.fastbill.com/api/1.0/api.php";
$curl = curl_init();
curl_setopt($curl,CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec($curl);
curl_close($curl);
print_r(json_decode($result));

Convert curl command to httparty

I am trying to add merge field in Mailchimp V3 list with HTTParty but not able to convert curl to HTTParty format.
Curl Request format which is working fine :
curl --request POST \
--url 'https://usxx.api.mailchimp.com/3.0/lists/17efad7sd4/merge-fields' \
--user '12:d1c1d99dr5000c63f0f73f64b88e852e-xx' \
--header 'content-type: application/json' \
--data '{"name":"FAVORITEJOKE", "type":"text"}' \
--include
Httparty format with error API key missing
response = HTTParty.post("https://us12.api.mailchimp.com/3.0/lists/17efad7sde/merge-fields",
:body => {
:user => '12:d1c1d99dr5000c63f0f73f64b88e852e-xx',
:data => '{"name":"FAVORITEJOKE", "type":"text"}',
:include => ''
}.to_json,
:headers => { 'Content-Type' => 'application/json' } )
I also try it without include option but not working
There are several errors in your code.
curl user is the basic auth user, but you are passing it in the payload of the request
data is the payload, instead you are passing it as a node in your payload and then you double serialize it
include makes no sense there, it's not a payload item
This should be the correct version. Please take a moment to read the HTTParty and curl documentation and understand the differences.
HTTParty.post(
"https://us12.api.mailchimp.com/3.0/lists/17efad7sde/merge-fields",
basic_auth: { username: "12", password: "d1c1d99dr5000c63f0f73f64b88e852e-xx" },
headers: { 'Content-Type' => 'application/json' },
body: {
name: "FAVORITEJOKE",
type: "text",
}.to_json
)

Rails RestClient pass token in header fails

I do this curl in Terminal which works excellent:
$ curl https://myurl.com/api/v1/orders/53e0ae7f6630361c46060000 -H "Authorization: Token xxxxxxxxxxxxxxxxxxxxxx"
Output is json.
Now I want to access the json string via my rails app. I have tried RestClient to do this, but somehow I always get a 401 unauthorized error. I believe the token gets not send correctly via header. I have tried the following:
RestClient.get 'https://myurl.com/api/v1/orders/53e0ae7f6630361c46060000', {token: 'xxxxxxxxxxxxxxxxxxxxxx'}
and
RestClient.get 'https://myurl.com/api/v1/orders/53e0ae7f6630361c46060000', :params => {:token => 'xxxxxxxxxxxxxxxxxxxxxx'}
with no success. Maybe I use a wrong syntax for sending the token in the header?
Doku is here http://rubydoc.info/github/rest-client/rest-client - I could not find any mistakes.
# GET request with modified headers
RestClient.get 'http://example.com/resource', {:Authorization => 'Bearer cT0febFoD5lxAlNAXHo6g'}
# POST request with modified headers
RestClient.post 'http://example.com/resource', {:foo => 'bar', :baz => 'qux'}, {:Authorization => 'Bearer cT0febFoD5lxAlNAXHo6g'}
# DELETE request with modified headers
RestClient.delete 'http://example.com/resource', {:Authorization => 'Bearer cT0febFoD5lxAlNAXHo6g'}
Source: https://github.com/rest-client/rest-client#headers

Resources