Techioz Blog

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