Ruby on rails 如何对&;批量请求的符号?

Ruby on rails 如何对&;批量请求的符号?,ruby-on-rails,facebook-graph-api,facebook-batch-request,Ruby On Rails,Facebook Graph Api,Facebook Batch Request,我有一个类似这样的例子: 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(r

我有一个类似这样的例子:

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=[{“方法”:“获取”,“相对url”:“搜索?q=EMAIL@ADDRESS.COM&类型=用户“}]

通过线路发送此信息将返回:

{"error"=>0, "error_description"=>"batch parameter must be a JSON array"} 
如果我删除
&type=user
,它工作正常(返回一个空数据数组)。我绝对肯定Facebook没有正确解析&字符。我在网上的某个地方读到,我可以尝试将&symbol编码为%26,但使用该替换项似乎可以查询“EMAIL@ADDRESS.COM%26type=用户”。如果你颠倒参数的顺序,你就会明白我的意思

有什么办法可以让Facebook上的批处理请求解析器在不提交永远无法修复的错误报告的情况下识别&symbol

编辑:

我正在使用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)

不要使用字符串文字来构造json。使用
来_json
,如下所示。(另一方面,不要在多行中使用
{}
符号,请使用
do
/
end

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

请尝试对整个参数进行正确的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]"
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]"
或者更好的方法是,首先使用
创建json
来创建json字符串。例如:

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

在实际操作了更多之后,我成功地重现了相同的行为,即使仔细检查并再次检查我是否正确地遵循了api规范。这看起来像是facebook批处理方法中的一个错误——它无法正确理解参数值中的符号。

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

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


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

将&编码为%26正是正确的解决方案。如果您输入“%26”并将其逐字显示出来,那么其他东西已经自动为您编码了。我感谢您的简化,并且我已经编辑了我的代码,但是,我得到的错误与之前完全相同(批处理参数必须是JSON数组)。你没有得到那个结果吗?@Vibhu,我没有访问令牌,所以我无法测试它。您可以从这些路由中的任何一个检索访问令牌,并可以非常轻松地进行尝试。再次感谢您的简化,但我正试图弄清楚为什么这个特殊情况不起作用,URI.encode与否。@Vibhu,您如何轻松获得访问令牌?据我所知,这是一个复杂的oauth过程。Ben,你能再次编辑你的答案,然后说它看起来像一个bug吗?将向上投票+选择作为答案。