Как отправить запрос JSON в рубине? У меня есть объект JSON, но я не думаю, что смогу это сделать .send
. Должен ли я использовать javascript для отправки формы?
Или я могу использовать класс net / http в ruby?
С заголовком - тип содержимого = json и тело объекта json?
ruby
json
httprequest
Энди
источник
источник
req = Net::HTTP::Post.new(uri.path, initheader = {'Content-Type' =>'application/json'})
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
источник
Я думаю, что HTTParty упрощает это (и работает с вложенными json и т.д., которые, похоже, не работали в других примерах, которые я видел.
require 'httparty' HTTParty.post("http://localhost:3000/api/v1/users", body: {user: {email: 'user1@example.com', password: 'secret'}}).body
источник
пример из реальной жизни, уведомить Airbrake API о новом развертывании через NetHttps
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"
или http://api.rubyonrails.org/classes/ActionController/HttpAuthentication/Token.htmlисточник
Простой пример запроса 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, но, по крайней мере, когда я исследовал в прошлый раз, они не позволяли мне эффективно проверять запросы, и они были только для HTTP, а не, например, для необработанных обменов TCP, эта система позволяет мне иметь единая структура для всего API-взаимодействия.
Предполагая, что вы просто хотите быстро и грязно преобразовать хэш в json, отправьте json на удаленный хост, чтобы протестировать API и проанализировать ответ на ruby, это, вероятно, самый быстрый способ без использования дополнительных драгоценных камней:
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Это работает на Ruby 2.4 HTTPS Post с записанным объектом JSON и текстом ответа.
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
источник
Мне нравится этот легкий клиент HTTP-запросов под названием unirest
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
источник
API net / http может быть трудным в использовании.
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|
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'
источник