SLRequestでGETなAPIの呼び方の注意点

FacebookのGraph APIはRest風な作りなのでGETやPOSTといったメソッドの別にも意味があり、GETが期待されてるAPIをうっかりPOSTで呼んでたら「success」とその他少々だけ入ったJSONが返ってきてさっぱり理由がわからなかったり。自分が間違ってるのにシミュレータを疑ってました。

そんな中で、さらに死ぬほどハマりました。NSURLとSLRequestのコンストラクタを次のようにしたら動かない。

let url = NSURL(string: "https://graph.facebook.com/v2.2/me/picture?type=large")
let req = SLRequest(forServiceType: SLServiceTypeFacebook,
            requestMethod: .GET, URL: url, parameters: nil)

ちゃんとサーバにアクセスした上で、JSONerrorをもらって返ってきてました。戻りのJSON({"error":{"message":"An active access token must be used to query information about the current user.","type":"OAuthException","code":2500}})でトークン間違いを主張されるので、ACAccountStoreを疑ったり、スレッドが悪さしているのかを疑ったりと、まったく明後日の方向で試行錯誤していました。実はリクエストパラメータを別途で引数に渡すと動きます。。。GETなのに。。。どういう内部の実装なのだろう?パラメータなしの/me/pictureがちゃんと動くので、処理の途中でURLからパラメータを落としちゃうというのでもなさそう。上では動かず、下なら動く。

let url = NSURL(string: "https://graph.facebook.com/v2.2/me/picture")
let req = SLRequest(forServiceType: SLServiceTypeFacebook,
            requestMethod: .GET, URL: url, parameters: ["type": "large"])

ほか、/meで["fields": "cover"]とか、["locale": "ja_JP"]とか。Facebook認証認可ありSLRequestではなく、先日書いたようにFacebook認証認可なしAlamofireでパブリック情報を取るのだと同じnameやpictureを取るのもURLにパラメータをつなげてでOKでした。SLRequestにはなんか今はわからない理由があるのだと思う。

そして今、謎なのがACAccountStore#saveAccount(ACAccount!, (Bool, NSError!)->Void)。どういうシチュエーションでどう使うのか、これから。