36

したがって、curlを使用したリクエストは次のとおりです。

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

私はルビーを使ってこれと同じリクエストをしようとしていますが、うまくいかないようです。

いくつかのライブラリも試しましたが、動作させることができません。これが私がこれまでに持っているものです:

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)

サポートされていない415のメディアタイプエラーが発生します。

4

4 に答える 4

63

あなたは近くにいますが、完全にはそこにいません。代わりに次のようなものを試してください。

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)

これにより、Content-Typeヘッダーが設定され、コードのようにフォームデータではなく、本文にJSONが投稿されます。サンプルのクレデンシャルを使用しても失敗しますが、実際のデータで機能するはずです。

于 2012-06-06T19:03:27.870 に答える
4

このリンクには、Net::HTTPを使用してJSONPOSTリクエストを作成する方法についての非常に優れた説明があります。

HTTPartyのようなライブラリを使用することをお勧めします。十分に文書化されているので、次のようにクラスを設定できます。

class RackSpaceClient
  include HTTParty

  base_uri "https://auth.api.rackspacecloud.com/"
  format :json
  headers 'Accept' => 'application/json'

  #methods to do whatever

end

そこに配置したRubyコードとcurlリクエストの主な違いは、curlリクエストがJSON(content-type application / json)をエンドポイントにPOSTするのに対しrequest.set_form_data、 POSTリクエスト(content-type application / x-www-form-urlencoded)。双方向のコンテンツがapplication/jsonタイプであることを確認する必要があります。

于 2012-06-06T17:54:42.810 に答える
3

もう一つの例:

#!/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
于 2015-08-25T18:35:32.783 に答える
3

他のすべてはここでは長すぎますワンライナーです:

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ニーズrequire 'json'


またはあなたがしたい場合

  • ホストを確認しない
  • 読みやすくする
  • 完了したら、接続が閉じていることを確認してください

それから:

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'}
    )
}

どのパラメータがどこに行くのかを覚えるのが難しい場合:

  • SSLオプションは接続ごとにあるため、接続を開くときに指定します。
  • 同じベースURLへの複数のREST呼び出しに接続を再利用できます。もちろん、スレッドセーフについて考えてください。
  • ヘッダーは「リクエストヘッダー」であるため、リクエストごとに指定されます。つまり、get///への呼び出しです。postpatch...
  • HTTP.start():新しいNet :: HTTPオブジェクトを作成し、さらにTCP接続とHTTPセッションを開きます。
  • HTTP.new():TCP接続またはHTTPセッションを開かずに、新しいNet::HTTPオブジェクトを作成します。
于 2016-02-02T18:03:10.837 に答える