1

API Goo.gl に記述されているように

マニュアルカールは完璧に機能します:

curl https://www.googleapis.com/urlshortener/v1/url \
    -H 'Content-Type: application/json' \
    -d '{"longUrl": "http://www.rubyinside.com/"}'

Bu Net::Http でこれを作成しようとすると:

require "net/https"
require "uri"
uri = URI.parse("https://www.googleapis.com/urlshortener/v1/url")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
request = Net::HTTP::Post.new(uri.path)
request["Content-Type"] = "application/json"
request.set_form_data({"longUrl" => "http://www.rubyinside.com/"})
response = http.request(request)
puts response.body

しかし、応答で失敗します:

{
 "error": {
  "errors": [
   {
    "domain": "global",
    "reason": "parseError",
    "message": "This API does not support parsing form-encoded input."
   }
  ],
  "code": 400,
  "message": "This API does not support parsing form-encoded input."
 }
}
 => nil

別の問題が表示されますが、機能していないようです

この httparty サンプル コードは動作しますが、net_http を使用したい

4

2 に答える 2

5

あなたがやろうとしているようにエンコードされたフォームではなく、jsonとしてデータを送信する必要があります。次のようにコードを変更してみてください。

....
require 'json'

....
request.body = {"longUrl" => "http://www.rubyinside.com/"}.to_json
于 2011-12-05T14:34:40.670 に答える
1

Ruby は私の分野ではありませんが、最近 C# で似たようなことをしました。Ruby-Doc.org のメソッドによると、.set_form_data はコンテンツ タイプ ヘッダーを「application/x-www-form-urlencoded」に設定し、JSON に設定するよりも優先されます。

Fiddler2 のようなツールは、何が起こっているのかを解読するのに非常に役立ちました。

この質問の回答には、net:http JSON の例へのリンクがあります https://stackoverflow.com/a/2037621/15710

于 2011-12-05T14:33:26.143 に答える