3

我有一个Facebook 批处理请求,如下所示:

https://graph.facebook.com/?access_token=ACCESS_TOKEN&batch=[{"method": "GET", "relative_url": " search?q=EMAIL@ADDRESS.COM&type=user "}]

通过网络发送它会返回:

{"error"=>0, "error_description"=>"batch parameter must be a JSON array"} 

如果我删除&type=user,它可以正常工作(发回一个空数据数组)。我绝对确定 Facebook 没有正确解析 & 字符。我在某处在线阅读,我可以尝试将 & 符号编码为 %26,但是使用该替换似乎改为查询“EMAIL@ADDRESS.COM%26type=user”。如果你颠倒参数的顺序,你就会明白我的意思。

有什么想法可以让 Facebook 上的批处理请求解析器识别 & 符号,而无需提交永远无法修复的错误报告?

编辑:

我正在使用 URI.encode。这是确切的代码:

    queries = email_array.map { |email| { :method => "GET", :relative_url => "search?q=#{email}&type=user" } }
    route = "https://graph.facebook.com/?access_token=#{token}&batch=#{URI.encode(queries.to_json)}"
    res = HTTParty.post(route)
4

3 回答 3

3

在实际玩了一些之后,我设法重现了相同的行为,即使仔细检查并仔细检查我是否正确遵循了 api 规范。这看起来像 facebook 的批处理方法中的一个错误——它不能正确理解参数值中的 & 符号。

于 2011-09-22T08:07:51.583 回答
2

不要使用字符串文字来构造 json。使用to_json,如下所示。(另外,顺便说一句,不要{}在多行中使用符号,使用do/ end)。

queries = []
email_array.each do |email|
  queries << {:method => 'GET', :relative_url => "search?q=#{email}&type=user"}
end

route = "https://graph.facebook.com/?access_token=#{token}&batch=#{URI.encode(queries.to_json)}"
res = HTTParty.post(route)

此外,您可以使用Array#map简单的代码,如下所示:

queries = email_array.map { |email| {:method => 'GET', :relative_url => "search?q=#{email}&type=user"} }
route = "https://graph.facebook.com/?access_token=#{token}&batch=#{URI.encode(queries.to_json)}"
res = HTTParty.post(route)

编辑:以下是我在编辑问题之前的原始答案,以供参考。

尝试正确地对整个参数进行 url 编码:

https://graph.facebook.com/?access_token=ACCESS_TOKEN&batch=[%7B%22method%22:%20%22GET%22,%20%22relative_url%22:%20%22search?q=EMAIL@ADDRESS.COM&type=user%22%7D]

在实践中,您将使用URI.encodefrom the urilibrary 来执行此操作。例子:

irb(main):001:0> require 'uri'
=> true
irb(main):002:0> URI.encode('[{"method": "GET", "relative_url": "search?q=EMAIL@ADDRESS.COM&type=user"}]')
=> "[%7B%22method%22:%20%22GET%22,%20%22relative_url%22:%20%22search?q=EMAIL@ADDRESS.COM&type=user%22%7D]"

或者更好的是,to_json首先用于创建您的 json 字符串。例子:

irb(main):001:0> require 'rubygems'
=> true
irb(main):002:0> require 'json'
=> true
irb(main):003:0> require 'uri'
=> true
irb(main):004:0> URI.encode([{:method => 'GET', :relative_url => 'search?q=EMAIL@ADDRESS.COM&type=user'}].to_json)
=> "[%7B%22method%22:%22GET%22,%22relative_url%22:%22search?q=EMAIL@ADDRESS.COM&type=user%22%7D]"
于 2011-09-22T06:23:56.257 回答
0

如果这对任何人都有帮助,当我的 AdSet 批量更新失败时,因为其中一个兴趣名称中有一个“&”:

{u'id': u'6003531450398', u'name': u'Dolce & Gabbana'}

我了解到名称可以是任何东西,只要 id 正确,FB 就会自行填充名称。

于 2015-04-12T23:07:17.893 回答