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
http.request(req).read_body
응답 본문을 읽으십시오. 큰!
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
실제 사례, 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}'`
바라건대 이것은 말할 필요도 없지만 프로덕션에서 사용하지 마십시오.
Net::HTTP
주장'
nobody should be using Net::HTTP any more
@bbozo
이것은 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
나는 '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
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
Net::HTTP.start(uri.host, uri.port, :use_ssl => true) do |client|
req = Net::HTTP::Post.new(uri.path, initheader = {'Content-Type' =>'application/json'})