Feature #12375
closedNet::HTTP.post
Description
Net::HTTP.post_form is convenient, but it's dedicated to application/x-www-form-urlencoded.
Why not provide Net::HTTP.post for other media types?
res = Net::HTTP.post(URI('http://www.example.com/api/search'),
{ "q" => "ruby", "max" => "50" }.to_json,
"Content-Type" => "application/json")
I've attached a patch, but there are some considerations:
- Net::HTTP.post_form supports basic authentication by userinfo in URLs,
but Net::HTTP.post doesn't, because it's deprecated by RFC3986.
Is it OK? - The first argument must be a URI object, but it might be better to accept a String.
- Should methods for other HTTP methods such as Net::HTTP.patch be added?
Files
Updated by usa (Usaku NAKAMURA) almost 10 years ago
Shugo Maeda wrote:
- The first argument must be a URI object, but it might be better to accept a String.
It should accept the hostname and the path parameters, like Net::HTTP.get.
Of course, to implement it is not so hard, so I believe you will do it before committing the patch :-)
Updated by shugo (Shugo Maeda) almost 10 years ago
Usaku NAKAMURA wrote:
Shugo Maeda wrote:
- The first argument must be a URI object, but it might be better to accept a String.
It should accept the hostname and the path parameters, like Net::HTTP.get.
Ah, I forgot to consider consistency with Net::HTTP.get.
Of course, to implement it is not so hard, so I believe you will do it before committing the patch :-)
It's easy to implement, but I meant that the following code:
res = Net::HTTP.post('http://www.example.com/api/search',
{ "q" => "ruby", "max" => "50" }.to_json,
"Content-Type" => "application/json")
The Net::HTTP.get style, which is less useful because it can't support HTTPS, will be as follows:
res = Net::HTTP.post('www.example.com',
'/api/search',
{ "q" => "ruby", "max" => "50" }.to_json,
"Content-Type" => "application/json")
It might be possible to support both styles by checking argument numbers and types,
but keyword arguments might be better....
Updated by shugo (Shugo Maeda) almost 10 years ago
Shugo Maeda wrote:
- The first argument must be a URI object, but it might be better to accept a String.
It should accept the hostname and the path parameters, like Net::HTTP.get.
Ah, I forgot to consider consistency with Net::HTTP.get.
After contemplation, I think Net::HTTP.post shouldn't accept the hostname, path,
and port parameters.
These parameters are useless because they can't support HTTPS, and adding optional
parameters is confusing because Net::HTTP.post needs to accept the mandatory request body
and the optional request header as its parameters.
The hostname, path, and port parameters of Net::HTTP.get might also have to be deprecated,
but it's a different issue.
I've attached a patch, but there are some considerations:
My thoughts about these considerations are:
- Net::HTTP.post_form supports basic authentication by userinfo in URLs, but Net::HTTP.post doesn't, because it's deprecated by RFC3986. Is it OK?
I think it's OK.
- The first argument must be a URI object, but it might be better to accept a String.
A String object shouldn't be accepted as the first argument, because it's confusing with
the Net::HTTP.get-like hostname argument.
- Should methods for other HTTP methods such as Net::HTTP.patch be added?
Such methods are not necessary because they are less popular than POST.
Updated by naruse (Yui NARUSE) almost 10 years ago
Just a note, I sometimes happen to write Net::HTTPS.open
Updated by naruse (Yui NARUSE) over 9 years ago
- Status changed from Open to Assigned
- Assignee changed from naruse (Yui NARUSE) to shugo (Shugo Maeda)
Agreed about Net::HTTP.post shouldn't support post(hostname, path, port) form because there's no reason to support to use HTTP.
Could you commit it?
Updated by shugo (Shugo Maeda) over 9 years ago
- Status changed from Assigned to Closed
Yui NARUSE wrote:
Agreed about Net::HTTP.post shouldn't support post(hostname, path, port) form because there's no reason to support to use HTTP.
Could you commit it?
Merged in r56597.