在ruby中使用HTTP post请求发送多行正文不起作用

icnyk63a  于 5个月前  发布在  Ruby
关注(0)|答案(1)|浏览(61)

**TL;DR:**我必须发出一个HTTP post请求,这在CURL中可以工作,但在ruby中不行。

如果我从终端使用CURL(使用Ubuntu)

curl https://api.kite.trade/session/token  \
   -H "X-Kite-Version: 3" \
   -d "api_key=XXX" \
   -d "request_token=XXX" \
   -d "checksum=XXX"

字符串
上面的CURL请求可以工作,我也可以得到响应。但是如果我尝试在ruby中使用HTTP gem,它就不工作了。

response = http.headers("X-Kite-Version"=>"3").post(
      "https://api.kite.trade/session/token",
      body: ("api_key=" + @api_key +"\n\r" "request_token=" + @request_token +"\n\r" "checksum=" + checksum_hash.to_s)
    )


我尝试了使用"\n""\n\r"的不同组合。我尝试将.html_safe放在"("api_key=" + @api_key +"\n\r" "request_token=" + @request_token +"\n\r" "checksum=" + checksum_hash.to_s)"之后。
我尝试了下面的方法:

params = [["api_key","XXX"],["request_token","XXX"],["checksum","XXX"]]


我尝试对上述参数进行URI编码,并将其传递到http请求的“body”参数中。但是它不起作用。
在大多数情况下,当我尝试使用HTTP gem调用时,我会得到下面的错误消息-
{“status”:“error”,“message”:“api_key的长度应至少为6个字符",“data”:null,“error_type”:“InputException”}
最有可能的是数据没有以服务器API能够理解的方式传递。而且我对服务器API没有任何控制。

jm81lzqq

jm81lzqq1#

cURL的-d选项在POST请求中将指定的数据发送到服务器,就像浏览器在用户填写HTML表单时所做的那样。
这在Ruby中翻译为set_form_data,如下所示:

require 'net/http'
require 'uri'

uri = URI.parse("https://api.kite.trade/session/token")

request = Net::HTTP::Post.new(uri)
request["X-Kite-Version"] = "3"
request.set_form_data(
  "api_key" => "XXX",
  "checksum" => "XXX",
  "request_token" => "XXX",
)

req_options = { use_ssl: uri.scheme == "https" }

response = Net::HTTP.start(uri.hostname, uri.port, req_options) do |http|
  http.request(request)
end

# response.code
# response.body

字符串

相关问题