Как установить заголовок с Net :: Http для службы Goo.gl Shorten? - PullRequest
1 голос
/ 05 декабря 2011

Как описано в API Goo.gl

Ручной завиток отлично работает:

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

Бу, когда я пытаюсь сделать это в 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

Я вижу другую проблему, но, кажется, не работает

Этот пример кода httpsy работает, но я хочу использовать net_http

Ответы [ 2 ]

5 голосов
/ 05 декабря 2011

Вы должны отправить свои данные в формате json, а не в кодированном виде, как вы пытаетесь это сделать.Попробуйте изменить свой код так:

....
require 'json'

....
request.body = {"longUrl" => "http://www.rubyinside.com/"}.to_json
1 голос
/ 05 декабря 2011

Ruby не моя область, но я недавно сделал нечто подобное в C #. Согласно Ruby-Doc.org, этот метод .set_form_data устанавливает заголовок типа контента на «application / x-www-form-urlencoded», который переопределяет настройку JSON.

Такой инструмент, как Fiddler2, очень помог в расшифровке происходящего.

Этот ответ на вопрос содержит ссылку на сеть: пример http JSON https://stackoverflow.com/a/2037621/15710

...