1. 程式人生 > >iOS拼接URL,類似安卓body體進行轉碼(轉為gbk)提交。

iOS拼接URL,類似安卓body體進行轉碼(轉為gbk)提交。

大家都知道,AFN去提交POST的時候是不用給他拼接URL的,但是♪(^∇^*),如果說你要對這個後面的body體進行轉碼的話,如果不拼接就無法實現了,還有一個就是如果安卓那邊url的確是拼接出來的,那麼我iOS不拼接的話,只有一個結果。。。那就是請求不到資料咯!

我用一個簡單的demo來說一下,如果你要拼接的是陣列怎麼辦,比如我傳的是字典對吧:@{@"h":@[@"1",@"2"]},那我想要的結果是http:....../?h=1&h=2,這種形式的,如果直接不做任何處理,顯然是不行的。

第一個問題,拼接URL:

拼接方法如下:

#pragma mark - 點選事件

- (IBAction

)pinjie:(id)sender {

NSDictionary *para = @{@"1":@[@"發動機異常",@"排氣管異常",@"玻璃窗升降慢"],@"2":@"ce",@"3":@[@"測試1",@"測試2"]};

    [selfdmsPostWithparaments:[para mutableCopy]];

}

#pragma mark - 拼接字串

-(void)dmsPostWithparaments:(NSMutableDictionary *)para {

NSMutableString *URL = [NSMutableStringstringWithString

:@"http://10.64.109.61:8080/DMSFrameworkWeb/MobileChannelServlet"];

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];

轉碼部分也一清二楚。

轉載請附上原文連結,謝謝。