3

次のような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)
4

3 に答える 3

3

実際にこれをもう少しいじった後、API仕様に正しく従っていることを注意深くチェックして再確認しても、同じ動作を再現することができました. これは、facebook のバッチ メソッドのバグのようです。パラメーター値のアンパサンドを正しく認識していません。

于 2011-09-22T08:07:51.583 に答える
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.encodefrom the urilibrary を使用してこれを行います。例:

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]"
于 2011-09-22T06:23:56.257 に答える
0

関心のある名前の 1 つに「&」が含まれていたために AdSet のバッチ更新が失敗したときに、これが誰かに役立つ場合:

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

名前は何でもよいことを学びました.IDが正しい限り、FBは名前自体を入力します.

于 2015-04-12T23:07:17.893 に答える