iOS拼接URL,类似安卓body体进行转码(转为gbk)提交。

来源:互联网 发布:mrp格式软件下载 编辑:程序博客网 时间:2024/06/06 17:40

大家都知道,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:[paramutableCopy]];

}

#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 = [arrayStrdataUsingEncoding: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];


转码部分也一清二楚。




转载请附上原文链接,谢谢。


0 0
原创粉丝点击