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

本文介绍了如何在iOS中拼接URL并进行GBK转码,以实现类似安卓的POST请求。通过字典转字符串和拼接方法,创建所需的URL,并使用Apple的原生请求方法进行GBK编码的POST请求。同时,文章强调了在拼接URL时去除问号(?)的重要性。

大家都知道,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"]};

    [self dmsPostWithparaments:[para mutableCopy]];

}

#pragma mark - 拼接字符串

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

    NSMutableString *URL = [NSMutableStringstringWithString:@"http://10.64.109.61:8080/DMSFrameworkWeb/MobileChannelServlet"];

    NSMutableArray *paraArray = [NSMutableArray new];

    NSString *postURL = nil;

    NSMutableString *arrayStr = [NSMutableString string];

    //字典转字符串---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:[NSArray class]]) {

                        for (int k = 0; k < [[paraArray[i] allValues][j] count]; k++) {

                            if (k== 0 ) {

                                string = [NSString stringWithFormat:@"?%@=%@", keys[j], paraArray[i][keys[j]][k]];

                            }else{

                                string = [NSString stringWithFormat:@"&%@=%@", keys[j], paraArray[i][keys[j]][k]];

                            }

                            [arrayStr appendString:string!= nil ?string :@""];

                        }

                    }else{

                        string = [NSString stringWithFormat:@"?%@=%@", keys[j], paraArray[i][keys[j]]];

                        [arrayStr appendString:string!= nil ?string :@""];

                    }

                    

                }

                else{

//                    //拼接时加&

                    if ([[paraArray[i] allValues][j] isKindOfClass:[NSArray class]]) {

                        for (int k = 0; k < [[paraArray[i] allValues][j] count]; k++) {

                        string = [NSString stringWithFormat:@"&%@=%@", keys[j], paraArray[i][keys[j]][k]];

                        [arrayStr appendString:string!= nil ?string :@""];

                        }


                    }else{

                        string = [NSString stringWithFormat:@"&%@=%@", 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 = [[NSMutableURLRequest alloc]init];

        [request setHTTPMethod:@"POST"];

        //指请求方式

        [request setURL:[NSURL URLWithString:[URL stringByAddingPercentEscapesUsingEncoding:encode]]];//设置请求的地址,以设置好的格式编码

        [request setHTTPBody:postData];  //设置请求的参数

        AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc]initWithRequest:request];

        [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {

            {

// 请求成功之后的返回

        } failure:^(AFHTTPRequestOperation *operation, NSError *error) {

            if ([error.userInfo[@"NSLocalizedDescription"isEqualToString:@"请求超时。"]) {

                [ZHYAlertBlock initWithTitle:@"网络请求超时或无网络" message:@"请从新登录"cancleButtonTitle:nil OtherButtonsArray:@[@"重新登录"clickAtIndex:^(NSInteger buttonIndex) {

                    

                }];

            }else if ([error.userInfo[@"NSLocalizedDescription"isEqualToString:@"似乎已断开与互联网的连接。"]){

                [ZHYAlertBlock initWithTitle:@"似乎已断开与互联网的连接。" message:@"请从新登录"cancleButtonTitle:nil OtherButtonsArray:@[@"重新登录"clickAtIndex:^(NSInteger buttonIndex) {

                }];

            }else{

                [ZHYAlertBlock initWithTitle:[NSString stringWithFormat:@"%@",error] message:nilcancleButtonTitle:nil OtherButtonsArray:@[@"OK"clickAtIndex:^(NSInteger buttonIndex) {

                }];

            }

        }];

        [operation start];


转码部分也一清二楚。




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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值