【问题标题】:How do I encode the & symbol for batch requests?如何对批处理请求的 & 符号进行编码?
【发布时间】:2011-11-22 13:07:03
【问题描述】:

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

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)

【问题讨论】:

  • 将 & 编码为 %26 正是正确的解决方案。如果您输入 "%26" 并且字面意思显示出来,那么其他东西已经自动为您编码 &。

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


【解决方案1】:

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

【讨论】:

    【解决方案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 库的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]"
    

    【讨论】:

    • 感谢您的简化,并且我已经编辑了我的代码,但是,我得到了与以前完全相同的错误(批处理参数必须是 JSON 数组)。你没有得到那个结果吗?
    • @Vibhu,我没有访问令牌,所以无法测试。
    • developers.facebook.com/docs/reference/api 您可以从任何这些路由中检索访问令牌并非常轻松地尝试。再次感谢简化,但我试图弄清楚为什么这种特殊情况不起作用,URI.encode 与否。
    • @Vibhu,如何轻松获得访问令牌?据我所知,这是一个复杂的 oauth 程序。
    • Ben 你能再次编辑你的答案并说它看起来像一个错误吗?将投票+选择作为答案。
    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-28
      • 2013-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-11
      相关资源
      最近更新 更多