Ruby で HTTP post リクエストを使用して複数行の本文を送信すると機能しない
概要
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)
)
「」を使用してさまざまな組み合わせを試しました 「、」 」。 “(”api_key=” + @api_key +” の後に .html_safe を入れてみました ” “request_token=” + @request_token +” ” “checksum=” + checksum_hash.to_s)”
以下の方法を試してみました。
params = [["api_key","XXX"],["request_token","XXX"],["checksum","XXX"]]
上記のパラメータを URI エンコードして、http リクエストの「body」パラメータに渡そうとしました。しかし、うまくいきませんでした。
これらのシナリオのほとんどでは、HTTP gem を使用して呼び出しを試みると、次のエラー メッセージが表示されます。
おそらく、サーバー API が理解できる方法でデータが渡されていない可能性があります。また、サーバー API を制御することもできません。
解決策
cURL の -d オプションは、ユーザーが HTML フォームに入力したときにブラウザーが行うのと同じ方法で、指定されたデータを POST リクエストでサーバーに送信します。
これは、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