17

在我的控制器中,我有以下代码......

response = HTTParty.get('https://graph.facebook.com/zuck')
logger.debug(response.body.id)

我得到一个 NoMethodError / 未定义的方法 `id'

如果我做...

logger.debug(response.body)

它按应有的方式输出...

{"id":"4","name":"Mark Zuckerberg","first_name":"Mark","last_name":"Zuckerberg","link":"http:\/\/www.facebook.com\/zuck","username":"zuck","gender":"male","locale":"en_US"}

有人会认为它是response.body.id,但显然这不起作用。提前致谢!

4

4 回答 4

36

尝试这个:

body = JSON.parse(response.body)
id = body["id"]

对于这种事情,我建议 a) 使用Koala或 b) 使用 httparty 创建一个类。然后您可以设置format: json为自动解析返回的 json。看这里这里

于 2013-08-19T18:34:31.490 回答
13

您可以使用如下方式强制将响应视为 JSON HTTParty.get

response = HTTParty.get("http://itunes.apple.com/search",
    {query: {term: 'tame impala'}, format: :json})

response['results'][0]['trackName']

=> "Let It Happen"
于 2015-05-08T04:30:50.187 回答
8

您可以response['id']在响应Content-Typeapplication/json或还response.parse_response获取从 JSON 有效负载生成的哈希的情况下使用。

response = HTTParty.get('https://graph.facebook.com/zuck')

payload = response.parsed_response

logger.debug(payload['id'])

注意:parsed_response是一个哈希,只有当响应Content-Typeapplication/json,否则HTTParty将返回它作为一个字符串。为了强制执行哈希,如果响应没有返回application/json,您可以将format作为参数传递HTTParty.get(url, format: :json)

于 2015-08-18T17:43:03.877 回答
0

HTTParty 应该根据返回的内容类型自动解析内容。zuck 的 json 似乎有些可疑。

pry(main)> HTTParty.get('https://graph.facebook.com/zuck')
=> "{\"id\":\"4\",\"first_name\":\"Mark\",\"gender\":\"male\",\"last_name\":\"Zuckerberg\",\"link\":\"https:\\/\\/www.facebook.com\\/zuck\",\"locale\":\"en_US\",\"name\":\"Mark Zuckerberg\",\"username\":\"zuck\"}"

但这工作正常:

pry(main)> HTTParty.get('http://echo.jsontest.com/foo/bar/baz/foo')
=> {"baz"=>"foo", "foo"=>"bar"}

require 'httparty'如果您自己在控制台中尝试,请不要忘记。

于 2014-05-02T11:20:09.237 回答