Рубин отправить запрос JSON

голоса
57

Как отправить запрос JSON в рубин? У меня есть объект JSON , но я не думаю , что я могу просто сделать .send. Должен ли я иметь Javascript отправить форму?

Или я могу использовать класс нетто / HTTP в рубин?

С заголовком - тип содержимого = JSON и тела объекта JSON?

Задан 08/01/2010 в 01:58
источник пользователем
На других языках...                            


11 ответов

голоса
50
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
Ответил 21/01/2014 в 16:56
источник пользователем

голоса
29
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
Ответил 15/05/2014 в 12:26
источник пользователем

голоса
15

HTTParty делает это немного проще , я думаю (и работает с вложенной JSON и т.д., которые не похож на работу в других примерах , которые я видел.

require 'httparty'
HTTParty.post("http://localhost:3000/api/v1/users", body: {user: {email: 'user1@example.com', password: 'secret'}}).body
Ответил 24/01/2013 в 01:39
источник пользователем

голоса
6

Простой пример запроса POST для JSON тем, что это нужно даже проще, чем то, что Том ссылается на:

require 'net/http'

uri = URI.parse("http://www.example.com/search.json")
response = Net::HTTP.post_form(uri, {"search" => "Berlin"})
Ответил 28/08/2012 в 11:39
источник пользователем

голоса
5

Предполагая, что вы просто хотите быстро и грязный преобразовать хэш JSON, отправить JSON на удаленный хост для тестирования API и анализировать ответ на рубин это, вероятно, самый быстрый способ без привлечения дополнительных драгоценных камней:

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

Надеюсь , это само собой разумеется, но не использовать это в производстве. Попробуйте Фарадея камень, Mislav дает убедительные аргументы , почему: http://mislav.uniqpath.com/2011/07/faraday-advanced-http/

Ответил 19/11/2013 в 15:11
источник пользователем

голоса
4

реальный пример жизни, уведомить 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

Ответил 05/09/2016 в 10:21
источник пользователем

голоса
1

Мне нравится этот облегченный клиент запрос 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
Ответил 05/04/2016 в 15:26
источник пользователем

голоса
0

Это работает на рубин 2.4 HTTPS сообщении с объектом 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
Ответил 11/03/2019 в 12:30
источник пользователем

голоса
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'
Ответил 16/07/2016 в 21:35
источник пользователем

голоса
0

Сеть / 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
Ответил 22/05/2015 в 03:13
источник пользователем

голоса
-2

Вы можете отправить JSON массив данных, как это:

require 'rest_client'
postData = Net::HTTP.post_form(URI.parse('http://www.xyz.com/api/valueoff'), 
                           {'data'=>jsonData})

Вы должны иметь rest_clientкамень для этого.

Ответил 27/04/2013 в 02:32
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more