AFNetworking Post JSON數據

AFNetworking Post JSON數據,兩種方法,都可以用下面分開介紹

使用AFNetworking3.0後網絡請求由原來的AFHTTPRequestOperationManager變爲AFHTTPSessionManager。一般的Post請求變成了這樣:

    NSMutableDictionary *params = [NSMutableDictionary dictionary];
    params[@"phoneNumber"] = @"18000000000";
    params[@"password"] = @"123";

    AFHTTPSessionManager *session = [AFHTTPSessionManager manager];
    [session POST:@"" parameters:@"" progress:params success:nil failure:nil];

最近後臺要求我們提交post請求使用JSON格式,如{"password":"123","phoneNumber":"18000000001"};

使用原有請求方式請求報錯error:Error Domain=com.alamofire.error.serialization.response Code=-1011 "Request failed: service unavailable (503)"。如圖:

無意間發現MJExtension中有將字典轉爲JSON字符串的方法[params mj_JSONString],然後心裏默默稱讚了傑哥的強大,看了下轉JSON的源碼,以爲如此簡單就可以解決問題。事實證明我還是too young too simple,控制檯依舊輸出錯誤error:Error Domain=NSCocoaErrorDomain Code=3840 "No value for key in object around character 7998."。

無奈之下趕緊到github上翻看AFNetworking的文檔,發現有這樣一句話:

    JSON Parameter Encoding
    [[AFJSONRequestSerializer serializer] requestWithMethod:@"POST" URLString:URLString parameters:parameters error:nil];

 POST http://example.com/
 Content-Type: application/json
 {"foo": "bar", "baz": [1,2,3]}

立馬將這句話加入到網絡請求當中:(方法一)   

    // 獲得請求管理者
    AFHTTPSessionManager *session = [AFHTTPSessionManager manager];
    
    // 設置請求格式
    session.requestSerializer = [AFJSONRequestSerializer serializer];
    [session.requestSerializer requestWithMethod:@"POST" URLString:URLString parameters:parameters error:nil];
    [session POST:@"" parameters:@"" progress:nil success:nil failure:nil];

果不其然,這次的返回結果就正常了。

(方法二)最後在網上搜尋了一圈看到也可以使用AFURLSessionManager來做網絡請求,不過AFURLSessionManager需要上傳個NSData類型的數據。代碼如下:
    NSData *postData = [parameters dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
    AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
    NSMutableURLRequest *request = [[AFJSONRequestSerializer serializer] requestWithMethod:@"POST" URLString:@"url" parameters:nil error:nil];
    request.timeoutInterval= [[[NSUserDefaults standardUserDefaults] valueForKey:@"timeoutInterval"] longValue];
    [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
    [request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
    [request setHTTPBody:postData];
    
    [[manager dataTaskWithRequest:request completionHandler:^(NSURLResponse * _Nonnull response, id  _Nullable responseObject, NSError * _Nullable error) {
        if (!error) {
            NSLog(@"responseObject: %@", responseObject);
        } else {
            NSLog(@"error: %@, %@, %@", error, response, responseObject);
        }
    }] resume];至此這個問題算是解決了,也可以正常拿到後臺返回的數據。





















參考:https://www.cnblogs.com/wanxudong/p/6213860.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章