はじめに
iPhoneアプリからサーバ側処理呼び出しを実装しました。
JSONのパラメータでPOSTリクエストし
レスポンスでもJSONを受け取る形です。
呼び出し部分にはAFNetworkingを使用したのですが
その時にサーバ側に値が渡せず空になってしまっていました。
呼び出し方が悪いのか
サーバ側の受け方が悪いのか...
試行錯誤した結果、成功したので共有します。
補足
サーバ側は、Azure上にWorkerロールを動作させています。C#で実装しました。
「タイムアウトの指定をしたい」という要件もありました。
データが渡せなかったのは単純に自分の理解ミス・実装ミスの可能性あります。
失敗した実装(AFHTTPRequestOperationManagerを使用)
呼び出し部分
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.requestSerializer = [AFJSONRequestSerializer serializer];
NSDictionary *param = @{@"key":@"xxx",
@"user":@{@"user_id":@"yyy"}};
[manager POST:@"http://http://XXX.cloudapp.net/YYY/get_user" parameters:param success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"success: %@", responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"fail: %@", error);
}];
成功した実装(AFHTTPRequestOperation)
WCFUtil.m
+ (AFHTTPRequestOperation *)makeRequestOperation:(NSString *)command param:(NSDictionary *)param timeoutInterval:(NSTimeInterval)timeoutInterval
{
NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"%@%@", @"http://XXX.cloudapp.net/YYY/", command]];
NSError *err = nil;
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:param options:NSJSONWritingPrettyPrinted error:&err];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:timeoutInterval];
[request setHTTPMethod:@"POST"];
[request setHTTPBody:jsonData];
return [[AFHTTPRequestOperation alloc] initWithRequest:request];
}
サーバ側処理呼び出し部分
NSDictionary *param = @{@"key":@"xxx",
@"user":@{@"user_id":@"yyy"}};
AFHTTPRequestOperation *operation = [WCFUtil makeRequestOperation:@"get_user" param:param timeoutInterval:30];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *op, id responseObject) {
NSError *parseError = nil;
NSDictionary *json = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingAllowFragments error:&parseError];
if ([json[@"result"] isEqualToString:@"OK"]) {
// 正常完了時処理
}
else {
// 失敗時処理
}
} failure:^(AFHTTPRequestOperation *op, NSError *error) {
NSLog(@"Error: %@", [error localizedDescription]);
}];
// 実行
[operation start];
おわりに
AFNetworking、Azure Workerロール、JSON
この組み合わせの実装で躓いた人に役立つかもです。
何かの参考になりましたら幸いです。