[ruby] Ruby는 JSON 요청을 보냅니다.

Ruby에서 JSON 요청을 어떻게 보내나요? JSON 개체가 있지만 할 수 있다고 생각하지 않습니다 .send. 양식을 자바 스크립트로 보내야합니까?

아니면 루비에서 net / http 클래스를 사용할 수 있습니까?

헤더-콘텐츠 유형 = json 및 본문 json 객체?



답변

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


답변

require 'net/http'
require 'json'

def create_agent
    uri = URI('http://api.nsa.gov:1337/agent')
    http = Net::HTTP.new(uri.host, uri.port)
    req = Net::HTTP::Post.new(uri.path, 'Content-Type' => 'application/json')
    req.body = {name: 'John Doe', role: 'agent'}.to_json
    res = http.request(req)
    puts "response #{res.body}"
rescue => e
    puts "failed #{e}"
end


답변

HTTParty 는 이것을 조금 더 쉽게 만듭니다 (그리고 내가 본 다른 예제에서는 작동하지 않는 중첩 된 json 등에서 작동합니다.

require 'httparty'
HTTParty.post("http://localhost:3000/api/v1/users", body: {user: {email: 'user1@example.com', password: 'secret'}}).body


답변

실제 사례, 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)

메모:

Authorization 헤더 세트 헤더 req['Authorization'] = "Token xxxxxxxxxxxx" 또는 http://api.rubyonrails.org/classes/ActionController/HttpAuthentication/Token.html을 통해 인증을 수행하는 경우


답변

Tom이 링크하는 것보다 훨씬 더 간단해야하는 사람들을위한 간단한 json POST 요청 예제 :

require 'net/http'

uri = URI.parse("http://www.example.com/search.json")
response = Net::HTTP.post_form(uri, {"search" => "Berlin"})


답변

2020 년입니다-아무도 Net::HTTP더 이상 사용해서는 안되며 모든 답변이 그렇게 말하는 것 같습니다. Faraday와 같은 더 높은 수준의 보석을 사용하세요.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}'`

바라건대 이것은 말할 필요도 없지만 프로덕션에서 사용하지 마십시오.


답변

이것은 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