我有一个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)
在实际使用了一些之后,我设法再现了相同的行为,即使经过仔细检查和反复检查,我正确地遵循了api规范。这看起来像是facebook的批处理方法中的一个bug——它不能正确理解参数值中的&号。
不要使用字符串字面值来构造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
库中的URI.encode
来完成此操作。例子:
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]"
如果这对任何人都有帮助,当我的AdSet批量更新失败时,因为其中一个兴趣名称中有"&":
{u'id': u'6003531450398', u'name': u'Dolce & Gabbana'}
我了解到名称可以是任何东西,只要id是正确的,FB将填充名称本身