LoginSignup
2
2

More than 5 years have passed since last update.

AFNetworkingのPOSTでJSONが空になってしまう場合

Last updated at Posted at 2015-01-18

はじめに

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
この組み合わせの実装で躓いた人に役立つかもです。

何かの参考になりましたら幸いです。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2