Project

General

Profile

Feature #12375

Net::HTTP.post

Added by shugo (Shugo Maeda) over 2 years ago. Updated about 2 years ago.

Status:
Closed
Priority:
Normal
Target version:
-
[ruby-core:75484]

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

net_http_s_post.diff (1.76 KB) net_http_s_post.diff shugo (Shugo Maeda), 05/13/2016 07:55 AM

History

Updated by usa (Usaku NAKAMURA) over 2 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 2 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 2 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 2 years ago

Just a note, I sometimes happen to write Net::HTTPS.open

Updated by naruse (Yui NARUSE) about 2 years ago

  • Assignee changed from naruse (Yui NARUSE) to shugo (Shugo Maeda)
  • Status changed from Open to Assigned

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 2 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.

Also available in: Atom PDF