IOS 7 利用系統自帶庫進行 POST JSON 非同步訪問操作

233jl發表於2014-06-07

在上篇文章中我談到了使用 ASIHTTPRequest JSONKit 等開源庫進行 POST JSON 到伺服器的操作。IOS 使用 POST、GET 提交 JSON 資料到伺服器由於在後續的開發中發現了一些問題(Stack overflow)Use ASIHTTPRequest to startAsynchronous and update UITableView but failed with EXC_BAD_ACCESS經過外國友人提示:ASIHTTPRequest 已經停止維護、在 IOS 7中存在已知 bug 。同時@未解 同學也建議我採用 AFNetworking。但是又不想學習其它的庫操作,於是嘗試使用系統自帶的庫進行 POST 操作。

(void)PostJson{

__block NSMutableDictionary *resultsDictionary;
/*
* 這裡 __block 修飾符必須要 因為這個變數要放在 block 中使用
*/
NSDictionary *userDictionary = [[NSDictionary alloc] initWithObjectsAndKeys:@"first title", @"title",@"1",@"blog_id", nil];//假設要上傳的 JSON 資料結構為 {"title":"first title","blog_id":"1"}
if ([NSJSONSerialization isValidJSONObject:userDictionary])//判斷是否有效
{
    NSError* error;
    NSData* jsonData = [NSJSONSerialization dataWithJSONObject:userDictionary options:NSJSONWritingPrettyPrinted error: &error];//利用系統自帶 JSON 工具封裝 JSON 資料
    NSURL* url = [NSURL URLWithString:@"www.google.com"];
    NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:30.0];
    [request setHTTPMethod:@"POST"];//設定為 POST 
    [request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
    [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
    [request setValue:[NSString stringWithFormat:@"%d",[jsonData length]] forHTTPHeaderField:@"Content-length"];
    [request setHTTPBody:jsonData];//把剛才封裝的 JSON 資料塞進去
     __block NSError *error1 = [[NSError alloc] init];

     /*
     *發起非同步訪問網路操作 並用 block 操作回撥函式
     */
    [NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc] init] completionHandler:^(NSURLResponse* response,NSData* data,NSError* error)
    {
        if ([data length]>0 && error == nil) {
            resultsDictionary = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:&error1];
            NSLog(@"resultsDictionary is %@",resultsDictionary);

        }else if ([data length]==0 && error ==nil){
            NSLog(@" 下載 data 為空");
        }
        else if( error!=nil){
            NSLog(@" error is %@",error);

        }
    }];
        }
    }
   }

事實上,我把這三行註釋掉也是可以的,不知道為什麼,請知道去掉會有什麼影響的朋友告知我。

    [request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
    [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
    [request setValue:[NSString stringWithFormat:@"%d",[jsonData length]] forHTTPHeaderField:@"Content-length"];

相關文章