如何编码&批量请求的符号?

时间:2011-09-22 06:17:27

标签: ruby-on-rails facebook-graph-api facebook-batch-request

我有Facebook batch request看起来像这样:

https://graph.facebook.com/?access_token=ACCESS_TOKEN&batch= [{“method”:“GET”,“relative_url”:“搜索?q = EMAIL @ ADDRESS.COM& type =用户“}]

通过电汇发送此信息:

{"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)

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分: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)

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

尝试正确编码整个参数的网址:

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.encode库中的uri来执行此操作。例如:

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]"

答案 2 :(得分:0)

如果这有助于任何人,当我的AdSet批量更新失败时,因为有“&amp;”在其中一个利益名称:

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

我了解到名称可以是任何名称,只要id正确,FB就会填充名称本身。