大家都知道,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];
转载请附上原文链接,谢谢。
本文介绍了如何在iOS中拼接URL并进行GBK转码,以实现类似安卓的POST请求。通过字典转字符串和拼接方法,创建所需的URL,并使用Apple的原生请求方法进行GBK编码的POST请求。同时,文章强调了在拼接URL时去除问号(?)的重要性。
提交。&spm=1001.2101.3001.5002&articleId=64919976&d=1&t=3&u=9fbf84ef7c9a454e893d948a5c00f384)
123

被折叠的 条评论
为什么被折叠?



