知っておくと便利?なちょっとしたtips集。サンプルコードはObjective-Cです。
OAuth2の認証情報を取り出したい
SDK経由でなく、生でリクエスト呼びたいなどに
SFOAuthCredentials *cred = [SFRestAPI sharedInstance].coordinator.credentials;
NSString *instanceUrl = cred.instanceUrl.absoluteString;
NSString *accessToken = cred.accessToken;
NSString *userId = cred.userId;
などが取れる。他はSFOAuthCredentialsのドキュメント参照。
ApexRestで公開しているAPIを呼びたい
デフォルトだとURLの頭に/services/data
を付けられてしまうので、/services/apexrest
で始まるAPIが呼べない。endpoint
を明示的に指定する必要がある。
SFRestRequest req = [SFRestRequest new];
req.method = @"GET";
req.path = path; // apiのパス
req.endpoint = @"/services/apexrest"; // ここが重要!
req.queryParams = @{@"queryString": @"hoge"}; // パラメータを渡したい場合NSDictionaryで
req.parseResponse = YES; // レスポンスがJSONな場合はYES
[[SFRestAPI sharedInstance] sendRESTRequest:req failBlock:^(NSError *e) {
// エラー時の処理
} completeBlock:^(NSDictionary *res) {
// 成功時の処理 (resにはパース済みのJSONが入ってる)
}];
multipart/form-data形式でAPIを呼びたい
Chatter投稿で写真添付したい場合など。multipart/form-dataでJSONと写真を送らないといけないが、SDKにそういったメソッドがない。
AFNetworking
を使ったサンプルコード。
AFHTTPRequestSerializer *serializer = [AFHTTPRequestSerializer new];
NSMutableURLRequest *req = [serializer multipartFormRequestWithMethod:@"POST" URLString:@"フルURL" parameters:nil constructingBodyWithBlock:^(AFMultipartFormData *data) {
// このブロック内でmultipart/form-dataに追加したいpartを必要数分追加する
// NSData *attachData = // 添付するファイルのバイナリデータ
[formData appendPartWithFileData:attachData name:@"feedItemFileUpload" fileName:@"photo.jpg" mimeType:@"image/jpeg"];
// 投稿の情報はJSONで別のpartとして追加
NSMutableDictionary *segments = @{}.mutableCopy;
NSMutableDictionary *body = @{@"body":@{@"messageSegments":segments}}.mutableCopy;
[segments addObject:@{
@"type":@"Text",
@"text":@"投稿したいテキスト"
}];
body[@"attachment"] = @{
@"attachmentType":@"NewFile",
@"title":@"Photo"
};
NSData *json = [NSJSONSerialization dataWithJSONObject:body options: NSJSONWritingPrettyPrinted error: nil];
[data appendPartWithHeaders:@{@"Content-Disposition":@"form-data; name=\"json\"", @"Content-Type":@"application/json; charset=UTF-8"} body:json];
} error:nil];
// 実際の呼び出し部分
AFHTTPRequestOperationManager *http = [AFHTTPRequestOperationManager new];
http.requestSerializer = serializer;
[serializer setValue:[NSString stringWithFormat:@"Bearer %@", accessToken] forHTTPHeaderField:@"Authorization"]; // 自前でAccessTokenを指定してやる
http.responseSerializer = [AFJSONResponseSerializer new];
AFHTTPRequestOperation *ope = [http HTTPRequestOperationWithRequest:req success:^(AFHTTPRequestOperation *operation, id responseObject) {
// 成功時の処理
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
// 失敗時の処理
}];
// 忘れがち。別スレッドで実行開始!
[ope start];