先看下復(fù)雜參數(shù)
{ "type":"1",
"sname":"\u6211\u7684\u8ba1\u5212",
"branchs":[{"btype":2,"blevel":0,"bname":"\u7a7a\u6c14\u80fd\u6c34\u8868","bid":263,"pflag":false}],
"shop_id":1,
"desc":"\u65e0",
"schedule_detail":[{"op_hour":16,"op_type":1,"op_min":2,"day_value":5,"day_type":1}]
}
一般的都是key Value的鍵值對.現(xiàn)在字典里面包含數(shù)組,數(shù)組中還有字典.
通常情況下我們使用下面代碼 就可以訪問了.
AFHTTPRequestOperationManager *manager = [self getRequstManager];
[manager POST:url parameters:parmas success:^(AFHTTPRequestOperation * _Nonnull operation, id _Nonnull responseObject) {
}
這里說明下默認(rèn)后面怎么封裝我們的參數(shù):
默認(rèn)會使用
AFURLRequestSerialization 這里類下的 請求系列化數(shù)據(jù)
截取這個(gè)類中一段源碼
switch (self.queryStringSerializationStyle) {
case AFHTTPRequestQueryStringDefaultStyle:
query = AFQueryStringFromParameters(parameters);
//brand_id=0&city_id=0&date_type=2&end_date=2016-04&shop_id=1
break;
}
這里 parameters 就是我們傳遞的NSDictiony 參數(shù)
通過
AFQueryStringFromParameters(parameters);
轉(zhuǎn)化用&符號拼接成鍵值對形式的String
例如:
brand_id=0&city_id=0&date_type=2&end_date=2016-04&shop_id=1
這里注意HTTP request 請求 的contentType是 application/x-www-form-urlencoded
[mutableRequest setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
所以,如果我們傳遞復(fù)雜的NSDictionary 字典中的value還有數(shù)組,數(shù)組中還有字典,
封裝的時(shí)候,會將參數(shù)全部壓平.
例如:
branchs%5B%5D%5Bbid%5D=263&
branchs%5B%5D%5Bblevel%5D=0&
branchs%5B%5D%5Bbname%5D=%E7%A9%BA%E6%B0%94%E8%83%BD%E6%B0%B4%E8%A1%A8&branchs%5B%5D%5Bbtype%5D=2&
branchs%5B%5D%5Bpflag%5D=0&
desc=%E6%97%A0&
schedule_detail%5B%5D%5Bday_type%5D=1&
schedule_detail%5B%5D%5Bday_value%5D=5&
schedule_detail%5B%5D%5Bop_hour%5D=17&
schedule_detail%5B%5D%5Bop_min%5D=40&
schedule_detail%5B%5D%5Bop_type%5D=1&
shop_id=1&
sname=%E6%88%91%E7%9A%84%E8%AE%A1%E5%88%92&type=1
branchs%5B%5D%5Bbid%5D 這串編碼后就是branchs[0][key] 就是說會將數(shù)組中的第一個(gè)元素中key 成為我們的鍵值對中的key.
所以采用 默認(rèn)的這種傳遞方式,會出問題.
一般這種復(fù)雜的參數(shù)傳遞,需要使用 json傳值
下面說下怎么使用json HTTP Request
AFHTTPRequestOperationManager *manager = [self getRequstManager];
manager.requestSerializer = [AFJSONRequestSerializer serializer];
[manager POST:url parameters:parmas success:^(AFHTTPRequestOperation * _Nonnull operation, id _Nonnull responseObject) {
}
這樣,就可以了.在 AFJSONRequestSerializer 對參數(shù)序列化的時(shí)候,就設(shè)置contentType為json了.
[mutableRequest setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
不過這里注意的是服務(wù)端獲取數(shù)據(jù)的方法不一樣,這樣切換,服務(wù)端有可能讀不到數(shù)據(jù).
一種是使用post的方法讀取,
一種是使用requestBody讀取(具體我也不清楚,后端開發(fā)人告訴我的,后端開發(fā)用的是python)