Come richiamare il metodo HTTP POST su SSL in ruby?

Ecco quindi la richiesta utilizzando curl:

curl -XPOST -H content-type:application/json -d "{\"credentials\":{\"username\":\"username\",\"key\":\"key\"}}" https://auth.api.rackspacecloud.com/v1.1/auth

Ho provato a fare questa richiesta utilizzando ruby, ma non riesco a farlo funzionare.

Ho provato un paio di librerie, ma non riesco a farlo funzionare.
Ecco ciò che ho finora:

uri = URI.parse("https://auth.api.rackspacecloud.com")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
request = Net::HTTP::Post.new("/v1.1/auth")
request.set_form_data({'credentials' => {'username' => 'username', 'key' => 'key'}})
response = http.request(request)

Ho un 415 unsupported media tipo di errore.

InformationsquelleAutor NielMalhotra | 2012-06-06



4 Replies
  1. 61

    Vi sono vicino, ma non abbastanza c’. Provare qualcosa di simile, invece:

    uri = URI.parse("https://auth.api.rackspacecloud.com")
    http = Net::HTTP.new(uri.host, uri.port)
    http.use_ssl = true
    http.verify_mode = OpenSSL::SSL::VERIFY_NONE
    request = Net::HTTP::Post.new("/v1.1/auth")
    request.add_field('Content-Type', 'application/json')
    request.body = {'credentials' => {'username' => 'username', 'key' => 'key'}}.to_json
    response = http.request(request)

    Questo imposta l’intestazione Content-Type post JSON nel corpo, piuttosto che in forma di dati come il codice aveva. Con il campione credenziali, ancora non funziona, ma ho il sospetto che dovrebbe funzionare con i dati reali in là.

    • Questo ha funzionato perfettamente. Grazie!
    • Mi potete aiutare con questa domanda : stackoverflow.com/questions/20771177/…
    • Ho suggerito una modifica per .to_json alla fine del request.body linea per evitare errori di codifica. Grazie per la grande risposta però!
    • Fantastico!!! Mi ha preso per sempre a trovare questa soluzione, ma per fortuna ho trovato questo post.
    • Nella seconda e ultima riga, perché stiamo passando i parametri nel corpo.. non dovremmo fare in modo che come un parametro di Query? Inoltre, vorrei sapere come passare lo stesso come parametro di query.
    • Perché le richieste POST richiedono il contenuto da inviare nel corpo in contrapposizione ai parametri di query che sono per lo più solo per OTTENERE le operazioni, anche se essi sono validi per pochi altri. POST e METTERE richiedono un corpo, però.
    • La mia esigenza è quella di inviare alcuni parametri di query di richiesta POST, Per esempio – someurl/token?grant_type=client_credentials. Come fare?
    • Si dovrebbe essere in grado di farlo, proprio come si farebbe per una richiesta GET ?grant_type=client_credentials, ma è necessario assicurarsi che il vostro Content-Length intestazione viene calcolata solo con il corpo, e non tra i parametri impostati nella stringa di query. Se si hanno problemi, si dovrebbe fare una nuova domanda a riguardo con più dettagli.
    • Si prega di essere attenti a come utilizza OpenSSL::SSL::VERIFY_NONE introduce una sicurezza di flusso. Si, sono vulnerabili ad un man-in-the-middle attack saltando il certificato SSL di verifica.

  2. 4

    C’è una buona spiegazione di come fare un JSON richiesta POST con Net::HTTP a questo link.

    Raccomando di usare una libreria come HTTParty. È ben documentato, si può solo impostare la classe in questo modo:

    class RackSpaceClient
      include HTTParty
    
      base_uri "https://auth.api.rackspacecloud.com/"
      format :json
      headers 'Accept' => 'application/json'
    
      #methods to do whatever
    
    end

    Sembra che la differenza principale tra il codice Ruby messo lì, e la richiesta riccio, è che il riccio richiesta di Pubblicazione di JSON (content-type application/json), l’endpoint, mentre request.set_form_data sta per inviare un modulo nel corpo del messaggio di richiesta (content-type application/x-www-form-urlencoded). È necessario assicurarsi che il contenuto di andare in entrambi i modi è di tipo application/json.

  3. 3

    Tutti gli altri sono troppo a lungo, qui è un UNA linea:

    Net::HTTP.start('auth.api.rackspacecloud.com', :use_ssl => true).post(
          '/v1.1/auth', {:credentials => {:username => "username",:key => "key"}}.to_json,
          initheader={'Content-Type' => 'application/json'}
        )

    * to_json esigenze require 'json'


    O se si desidera

    • NON verificare i padroni di casa
    • essere più leggibile
    • verificare che la connessione è chiusa una volta che hai finito di

    quindi:

    ssl_opts={:use_ssl => true, :verify_mode => OpenSSL::SSL::VERIFY_NONE}
    Net::HTTP.start('auth.api.rackspacecloud.com', ssl_opts) { |secure_connection|
      secure_connection.post(
          '/v1.1/auth', {:credentials => {:username => "username",:key => "key"}}.to_json,
          initheader={'Content-Type' => 'application/json'}
        )
    }

    Nel caso In cui è difficile ricordare ciò che params andare dove:

    • SSL opzioni sono per connessione in modo che si specificare durante l’apertura del collegamento.
    • Si può riutilizzare la connessione per più di RIPOSO chiamate stesso url di base. Pensare di filo di sicurezza, naturalmente.
    • Intestazione è una richiesta di “intestazione” e, quindi, specificato per ogni richiesta. I. e. chiamate per get/post/patch/....
    • HTTP.start(): Crea un nuovo Net::HTTP oggetto, inoltre, si apre una connessione TCP e HTTP di sessione.
    • HTTP.new(): Crea un nuovo Net::HTTP oggetto senza l’apertura di una connessione TCP o HTTP di sessione.
  4. 3

    Un altro esempio:

    #!/usr/bin/ruby
    
    require 'net/http'
    require 'json'
    require 'uri'
    
    full_url = "http://" + options[:artifactory_url] + "/" + "api/build/promote/" + options[:build]
    
    puts "Artifactory url: #{full_url}"
    
    data = {
        status: "staged",
        comment: "Tested on all target platforms.",
        ciUser: "builder",
        #timestamp: "ISO8601",
        dryRun: false,
        targetRepo: "#{options[:target]}",
        copy: true,
        artifacts: true,
        dependencies: false,
        failFast: true,
    }
    
    uri = URI.parse(full_url)
    headers = {'Content-Type' => "application/json", 'Accept-Encoding'=> "gzip,deflate",'Accept' => "application/json" }
    http = Net::HTTP.new(uri.host, uri.port)
    request = Net::HTTP::Post.new(uri.request_uri, headers)
    request.basic_auth(options[:user], options[:password])
    request.body = data.to_json
    response = http.request(request)
    
    puts response.code
    puts response.body

Lascia un commento