x-www-form-urlencoded POST 请求和 net/http 缺少查询参数
Missing query parameters on x-www-form-urlencoded POST request and net/http
我有一个 post 请求 headers 和我想用 net/http
触发的查询参数。请求 returns 200 但响应 body 说:{\"error\":\"invalid_request\",\"error_description\":\"Required query parameter 'grant_type' missing.\"}
这是我调用的完整函数:
def Search.request_oauth_access_token
require 'net/http'
uri = URI.parse('https://request.url/oauth2/access_token')
params = {
'grant_type' => 'my:grant:type'
}
headers = {
'Authorization' => 'Basic sldhfgKGsdfgGOI23==',
'Content-Type' => 'application/x-www-form-urlencoded'
}
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
request = Net::HTTP::Post.new(uri.request_uri, headers)
query = URI.encode_www_form_component(params)
request.body = query
response = http.request(request)
p response.body
end
我正在使用 Rails 5.0.2.
解决了。原来我在 params
定义中有一个语法错误。
这是定义它的正确方法:
params = {
grant_type: 'my:grant:type'
}
然后在请求中:
query = URI.encode_www_form(params)
http.request(request, query)
您还可以将参数语法更改为以下内容:
params = [ [ "param1", "value1" ], [ "param2", "value2" ], [ "param3", "value3" ] ]
最简单的方法是使用 ruby 核心库:
require "uri"
require "net/http"
params = {
'field1' => 'Nothing is less important',
'field2' => 'Submit'
}
x = Net::HTTP.post_form(URI.parse('http://www.yahoo.com/web/ch05/formpost.asp'), params)
puts x.body
这拯救了我的一天
我有一个 post 请求 headers 和我想用 net/http
触发的查询参数。请求 returns 200 但响应 body 说:{\"error\":\"invalid_request\",\"error_description\":\"Required query parameter 'grant_type' missing.\"}
这是我调用的完整函数:
def Search.request_oauth_access_token
require 'net/http'
uri = URI.parse('https://request.url/oauth2/access_token')
params = {
'grant_type' => 'my:grant:type'
}
headers = {
'Authorization' => 'Basic sldhfgKGsdfgGOI23==',
'Content-Type' => 'application/x-www-form-urlencoded'
}
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
request = Net::HTTP::Post.new(uri.request_uri, headers)
query = URI.encode_www_form_component(params)
request.body = query
response = http.request(request)
p response.body
end
我正在使用 Rails 5.0.2.
解决了。原来我在 params
定义中有一个语法错误。
这是定义它的正确方法:
params = {
grant_type: 'my:grant:type'
}
然后在请求中:
query = URI.encode_www_form(params)
http.request(request, query)
您还可以将参数语法更改为以下内容:
params = [ [ "param1", "value1" ], [ "param2", "value2" ], [ "param3", "value3" ] ]
最简单的方法是使用 ruby 核心库:
require "uri"
require "net/http"
params = {
'field1' => 'Nothing is less important',
'field2' => 'Submit'
}
x = Net::HTTP.post_form(URI.parse('http://www.yahoo.com/web/ch05/formpost.asp'), params)
puts x.body
这拯救了我的一天