3

我有一個Facebook batch request,看起來像這樣:如何爲批處理請求編碼&符號?

https://graph.facebook.com/?access_token=ACCESS_TOKEN &批= [{ 「方法」: 「GET」, 「relative_url」:「搜索? [email protected] &類型=用戶「}]

通過線路返回發送此:

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

如果我刪除&type=user,它工作正常(回送一個空的數據陣列) 。我絕對確信Facebook不會正確解析&字符。我在網上在線閱讀,我可以嘗試將&符號編碼爲%26,但是使用該替換似乎會對「[email protected]%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) 
+0

將&編碼到%26完全是正確的解決方案。如果你輸入了「%26」並且字面出來,那麼其他的東西已經自動爲你編碼了。 –

回答

3

其實玩這個周圍多一些後,我設法重現相同的行爲,即使仔細檢查,並仔細檢查,我是正確遵循了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%[email protected]&type=user%22%7D] 

在實踐中,你會使用URI.encodeuri庫做到這一點。例如:

irb(main):001:0> require 'uri' 
=> true 
irb(main):002:0> URI.encode('[{"method": "GET", "relative_url": "[email protected]&type=user"}]') 
=> "[%7B%22method%22:%20%22GET%22,%20%22relative_url%22:%20%[email protected]&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 => '[email protected]&type=user'}].to_json) 
=> "[%7B%22method%22:%22GET%22,%22relative_url%22:%[email protected]&type=user%22%7D]" 
+0

請檢查我的編輯 – VNO

+0

@Vibhu,好吧我更新了我的答案,以反映您的編輯。 –

+0

我欣賞你的簡化,並且我編輯了代碼,但是,我得到了與以前完全相同的錯誤(批處理參數必須是JSON數組)。你沒有得到那個結果嗎? – VNO

0

如果這可以幫助任何人,當我AdSet批更新失敗,因爲在利益的名字之一出現了「&」:

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

我瞭解到,名稱可以是任何東西,只要由於id是正確的,FB會填充名稱本身。