iOS拼接URL,類似安卓body體進行轉碼(轉為gbk)提交。
大家都知道,AFN去提交POST的時候是不用給他拼接URL的,但是♪(^∇^*),如果說你要對這個後面的body體進行轉碼的話,如果不拼接就無法實現了,還有一個就是如果安卓那邊url的確是拼接出來的,那麼我iOS不拼接的話,只有一個結果。。。那就是請求不到資料咯!
我用一個簡單的demo來說一下,如果你要拼接的是陣列怎麼辦,比如我傳的是字典對吧:@{@"h":@[@"1",@"2"]},那我想要的結果是http:....../?h=1&h=2,這種形式的,如果直接不做任何處理,顯然是不行的。
第一個問題,拼接URL:
拼接方法如下:
#pragma mark - 點選事件
- (IBAction
NSDictionary *para = @{@"1":@[@"發動機異常",@"排氣管異常",@"玻璃窗升降慢"],@"2":@"ce",@"3":@[@"測試1",@"測試2"]};
[selfdmsPostWithparaments:[para mutableCopy]];
}
#pragma mark - 拼接字串
-(void)dmsPostWithparaments:(NSMutableDictionary *)para {
NSMutableString *URL = [NSMutableStringstringWithString
NSMutableArray *paraArray = [NSMutableArraynew];
NSString *postURL = nil;
NSMutableString *arrayStr = [NSMutableStringstring];
//字典轉字串---url
if (para != nil) {
[paraArray addObject:para];
for (int i = 0; i < paraArray.count; i++) {
NSArray *keys = [paraArray[i] allKeys];
//拼接字串
for (int j = 0; j < keys.count; j++) {
NSString *string;
if (j == 0) {
//拼接時加?
if ([[paraArray[i] allValues][j] isKindOfClass:[NSArrayclass]]) {
for (int k = 0; k < [[paraArray[i] allValues][j] count]; k++) {
if (k== 0 ) {
string = [NSStringstringWithFormat:@"?%@=%@", keys[j], paraArray[i][keys[j]][k]];
}else{
string = [NSStringstringWithFormat:@"&%@=%@", keys[j], paraArray[i][keys[j]][k]];
}
[arrayStr appendString:string!= nil ?string :@""];
}
}else{
string = [NSStringstringWithFormat:@"?%@=%@", keys[j], paraArray[i][keys[j]]];
[arrayStr appendString:string!= nil ?string :@""];
}
}
else{
// //拼接時加&
if ([[paraArray[i] allValues][j] isKindOfClass:[NSArrayclass]]) {
for (int k = 0; k < [[paraArray[i] allValues][j] count]; k++) {
string = [NSStringstringWithFormat:@"&%@=%@", keys[j], paraArray[i][keys[j]][k]];
[arrayStr appendString:string!= nil ?string :@""];
}
}else{
string = [NSStringstringWithFormat:@"&%@=%@", keys[j], [paraArray[i] allValues][j]];
[arrayStr appendString:string != nil?string :@"" ];
}
}
//拼接字串
}
}
}
[URL appendString:arrayStr != nil ?arrayStr :@""];
postURL = [URL copy];
NSLog(@"所需url:%@",postURL);
}
列印如下所示:
第二個問題,對body體進行轉碼。
首先要是想對body體進行轉碼,那肯定就不能用最初的afn--post請求方法,就要用apple自帶的原生的請求方法,還有一點,如果用這個方法,上面我拼接好的body體就是arrayStr,在拼接時要把新增進去的?去掉,因為這裡其實是不需要這一塊的。程式碼如下:
NSStringEncoding encode = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);//設定編碼型別,GBK格式
NSData* postData = [arrayStr dataUsingEncoding:encode]; //將請求引數字串轉成NSData型別
NSMutableURLRequest *request = [[NSMutableURLRequestalloc]init];
[request setHTTPMethod:@"POST"];
//指請求方式
[request setURL:[NSURLURLWithString:[URL stringByAddingPercentEscapesUsingEncoding:encode]]]; //設定請求的地址,以設定好的格式編碼
[request setHTTPBody:postData]; //設定請求的引數
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperationalloc]initWithRequest:request];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
{
//請求成功之後的返回
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
if ([error.userInfo[@"NSLocalizedDescription"] isEqualToString:@"請求超時。"]) {
[ZHYAlertBlockinitWithTitle:@"網路請求超時或無網路"message:@"請從新登入"cancleButtonTitle:nilOtherButtonsArray:@[@"重新登入"] clickAtIndex:^(NSInteger buttonIndex) {
}];
}elseif ([error.userInfo[@"NSLocalizedDescription"] isEqualToString:@"似乎已斷開與網際網路的連線。"]){
[ZHYAlertBlockinitWithTitle:@"似乎已斷開與網際網路的連線。"message:@"請從新登入"cancleButtonTitle:nilOtherButtonsArray:@[@"重新登入"] clickAtIndex:^(NSInteger buttonIndex) {
}];
}else{
[ZHYAlertBlockinitWithTitle:[NSStringstringWithFormat:@"%@",error] message:nilcancleButtonTitle:nilOtherButtonsArray:@[@"OK"] clickAtIndex:^(NSInteger buttonIndex) {
}];
}
}];
[operation start];
轉碼部分也一清二楚。轉載請附上原文連結,謝謝。