91

RubyでJSONリクエストを送信するにはどうすればよいですか? 私はJSONオブジェクトを持っていますが、私ができるとは思いません.send. JavaScript でフォームを送信する必要がありますか?

または、Ruby で net/http クラスを使用できますか?

ヘッダー付き - コンテンツ タイプ = json およびボディ json オブジェクト?

4

10 に答える 10

86
uri = URI('https://myapp.com/api/v1/resource')
req = Net::HTTP::Post.new(uri, 'Content-Type' => 'application/json')
req.body = {param1: 'some value', param2: 'some other value'}.to_json
res = Net::HTTP.start(uri.hostname, uri.port) do |http|
  http.request(req)
end
于 2014-01-21T15:56:26.797 に答える
17

HTTPartyを使用すると、これが少し簡単になります(ネストされたjsonなどで機能しますが、これまでに見た他の例では機能しなかったようです。

require 'httparty'
HTTParty.post("http://localhost:3000/api/v1/users", body: {user: {email: 'user1@example.com', password: 'secret'}}).body
于 2013-01-24T00:39:01.710 に答える
7

実際の例では、NetHttps を介して新しい展開について Airbrake APIに通知します

require 'uri'
require 'net/https'
require 'json'

class MakeHttpsRequest
  def call(url, hash_json)
    uri = URI.parse(url)
    req = Net::HTTP::Post.new(uri.to_s)
    req.body = hash_json.to_json
    req['Content-Type'] = 'application/json'
    # ... set more request headers 

    response = https(uri).request(req)

    response.body
  end

  private

  def https(uri)
    Net::HTTP.new(uri.host, uri.port).tap do |http|
      http.use_ssl = true
      http.verify_mode = OpenSSL::SSL::VERIFY_NONE
    end
  end
end

project_id = 'yyyyyy'
project_key = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
url = "https://airbrake.io/api/v4/projects/#{project_id}/deploys?key=#{project_key}"
body_hash = {
  "environment":"production",
  "username":"tomas",
  "repository":"https://github.com/equivalent/scrapbook2",
  "revision":"live-20160905_0001",
  "version":"v2.0"
}

puts MakeHttpsRequest.new.call(url, body_hash)

ノート:

req['Authorization'] = "Token xxxxxxxxxxxx" Authorizationヘッダーセットヘッダーまたはhttp://api.rubyonrails.org/classes/ActionController/HttpAuthentication/Token.htmlを介して認証を行う場合

于 2016-09-05T10:21:38.710 に答える
5

これは、JSON オブジェクトと書き出された応答本文を含む ruby​​ 2.4 HTTPS Post で機能します。

require 'net/http' #net/https does not have to be required anymore
require 'json'
require 'uri'

uri = URI('https://your.secure-url.com')
Net::HTTP.start(uri.host, uri.port, :use_ssl => uri.scheme == 'https') do |http|
  request = Net::HTTP::Post.new(uri, 'Content-Type' => 'application/json')
  request.body = {parameter: 'value'}.to_json
  response = http.request request # Net::HTTPResponse object
  puts "response #{response.body}"
end
于 2019-03-11T12:30:29.643 に答える
3

「unirest」と呼ばれる軽量の http リクエスト クライアントが気に入っています。

gem install unirest

利用方法:

response = Unirest.post "http://httpbin.org/post", 
                        headers:{ "Accept" => "application/json" }, 
                        parameters:{ :age => 23, :foo => "bar" }

response.code # Status code
response.headers # Response headers
response.body # Parsed body
response.raw_body # Unparsed body
于 2016-04-05T15:26:19.367 に答える
3

トムがリンクしているものよりもさらに単純なものを必要とする人のための単純なjson POSTリクエストの例:

require 'net/http'

uri = URI.parse("http://www.example.com/search.json")
response = Net::HTTP.post_form(uri, {"search" => "Berlin"})
于 2012-08-28T10:39:46.160 に答える
2

それは2020年です-誰ももう使用するべきではなくNet::HTTP、すべての回答がそう言っているようです.Faradayなどのより高レベルのgemを使用してください-Github


そうは言っても、私がやりたいのは、HTTP API 呼び出しのラッパーです。

rv = Transporter::FaradayHttp[url, options]

これにより、依存関係を追加せずに HTTP 呼び出しを偽造できるためです。

  if InfoSig.env?(:test) && !(url.to_s =~ /localhost/)
    response_body = FakerForTests[url: url, options: options]

  else
    conn = Faraday::Connection.new url, connection_options

フェイカーがこんな感じに見えるところ

HTTP モッキング/スタブ フレームワークがあることは知っていますが、少なくとも前回調査したときは、リクエストを効率的に検証できず、生の TCP 交換などではなく、HTTP のみを対象としていました。すべての API 通信の統合フレームワーク。


ハッシュをjsonにすばやくダーティに変換したいだけだと仮定し、jsonをリモートホストに送信してAPIをテストし、ルビーへの応答を解析します。これは、追加のgemを必要としないおそらく最速の方法です。

JSON.load `curl -H 'Content-Type:application/json' -H 'Accept:application/json' -X POST localhost:3000/simple_api -d '#{message.to_json}'`

うまくいけば、これは言うまでもありませんが、本番環境では使用しないでください。

于 2013-11-19T14:11:50.130 に答える
1

net/http API は使いにくい場合があります。

require "net/http"

uri = URI.parse(uri)

Net::HTTP.new(uri.host, uri.port).start do |client|
  request                 = Net::HTTP::Post.new(uri.path)
  request.body            = "{}"
  request["Content-Type"] = "application/json"
  client.request(request)
end
于 2015-05-22T03:13:05.283 に答える
0
data = {a: {b: [1, 2]}}.to_json
uri = URI 'https://myapp.com/api/v1/resource'
https = Net::HTTP.new uri.host, uri.port
https.use_ssl = true
https.post2 uri.path, data, 'Content-Type' => 'application/json'
于 2016-07-16T21:35:39.057 に答える