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) over 8 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) over 8 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) over 8 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) over 8 years ago
Just a note, I sometimes happen to write Net::HTTPS.open
Updated by naruse (Yui NARUSE) about 8 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) about 8 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.