iOS 网络问题
2016-03-23 14:58
344 查看
iOS 网络问题
最近一直在独立负责一个项目,碰到了一些网络问题,之前一直是使用AFNetworking的,基本上所有的网络问题都能解决,刚好这个项目有几个接口使用的是不一致的请求方式,困扰了我好久。之前一直用AFN,原生的网络方法都忘光了。
我碰到的这个问题是:同一个参数可传多个值,所以参数肯定不能用字典来传参,这个的话只能传一个值,比如有一个time参数,要求传入多个时间段,如果用字典的话:@{@“time” : @"09:00-12:00"},就只能传一个值,用数组的话,我们的后台也不能识别。
后来我干脆参照AFN官网,把所有的方法都试了一遍 ,也还是不行。
这样出来的NSURLRequest的HTTPBody 的 转换为NSString 是 09:00-12:00 14:00- 18:00 20:00-22:00
time%5B%5D=09%3A00-1200&time%5B%5D=14%3A00-18%3A00&time%5B%5D=20%3A00-22%3A00
格式服务器无法识别
后来我单独传了一个时间段 09:00-12:00 过去 ,发现NSURLRequest的HTTPBody 的 转换为NSString 是
time=09%3A00-1200
看着两个HTTPBody, 我灵机一动, 自己写了个
NSString *timeStr =@"time=07:00-10:00&time=14:00-17:00&time=21:00-22:00&time=22:10-22:20&time=22:30-23:00";
NSData *timeData = [timeStrdataUsingEncoding:NSUTF8StringEncoding];
request.HTTPBody = timeData;
然后就TM成功了!!!!! 这个方法我用的是官方的网络请求方法。
完整代码如下:
NSString *URLStr = [NSStringstringWithFormat:@"%@/mobile/expert/time/setting",kBaseURL];
/*
NSDictionary *parameters = @{@"time" : @[@"09:00-1200", @"14:00-18:00", @"20:00-22:00"]};
AFN 转换之后HTTPBody -> time%5B%5D=09%3A00-1200&time%5B%5D=14%3A00-18%3A00&time%5B%5D=20%3A00-22%3A00 格式服务器无法识别
*/
// NSDictionary *parameters =@{@"time" :@[@"09:00-1200",@"14:00-18:00",
@"20:00-22:00"]};
//AFN的方法
// NSMutableURLRequest *realRequest = [[AFHTTPRequestSerializer serializer]requestWithMethod:@"POST" URLString:URLStr parameters:parameters error:nil];
NSMutableURLRequest *request = [NSMutableURLRequestrequestWithURL:[NSURLURLWithString:URLStr]];
//头部参数 token
NSString *token = [MCFunctionreadUserLoginInfo][@"token"];
[request setValue:tokenforHTTPHeaderField:@"X-session-token"];
request.HTTPMethod =
@"POST";
// NSData *data = realRequest.HTTPBody;
// NSString *str = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
// MCLog(@"%@",str);
NSString *timeStr =@"time=07:00-10:00&time=14:00-17:00&time=21:00-22:00&time=22:10-22:20&time=22:30-23:00";
NSData *timeData = [timeStrdataUsingEncoding:NSUTF8StringEncoding];
request.HTTPBody = timeData;
NSOperationQueue *queue = [[NSOperationQueuealloc]init];
[NSURLConnectionsendAsynchronousRequest:request
queue:queue
completionHandler:^(NSURLResponse *response,NSData *data,
NSError *error){
if (error) {
NSLog(@"Httperror:%@%ld", error.localizedDescription,(long)error.code);
}else{
NSInteger responseCode = [(NSHTTPURLResponse *)responsestatusCode];
NSString *responseString = [[NSStringalloc]
initWithData:dataencoding:NSUTF8StringEncoding];
NSLog(@"HttpResponseCode:%ld", (long)responseCode);
NSLog(@"HttpResponseBody %@",responseString);
}
}];
上班时间匆匆写的,格式不好,将就将就哈。
最近一直在独立负责一个项目,碰到了一些网络问题,之前一直是使用AFNetworking的,基本上所有的网络问题都能解决,刚好这个项目有几个接口使用的是不一致的请求方式,困扰了我好久。之前一直用AFN,原生的网络方法都忘光了。
我碰到的这个问题是:同一个参数可传多个值,所以参数肯定不能用字典来传参,这个的话只能传一个值,比如有一个time参数,要求传入多个时间段,如果用字典的话:@{@“time” : @"09:00-12:00"},就只能传一个值,用数组的话,我们的后台也不能识别。
后来我干脆参照AFN官网,把所有的方法都试了一遍 ,也还是不行。
URL Form Parameter Encoding
[[AFHTTPRequestSerializer serializer] requestWithMethod:@"POST" URLString:URLString parameters:parameters error:nil];
POST http://example.com/ Content-Type: application/x-www-form-urlencoded foo=bar&baz[]=1&baz[]=2&baz[]=3
这样出来的NSURLRequest的HTTPBody 的 转换为NSString 是 09:00-12:00 14:00- 18:00 20:00-22:00
time%5B%5D=09%3A00-1200&time%5B%5D=14%3A00-18%3A00&time%5B%5D=20%3A00-22%3A00
格式服务器无法识别
后来我单独传了一个时间段 09:00-12:00 过去 ,发现NSURLRequest的HTTPBody 的 转换为NSString 是
time=09%3A00-1200
看着两个HTTPBody, 我灵机一动, 自己写了个
NSString *timeStr =@"time=07:00-10:00&time=14:00-17:00&time=21:00-22:00&time=22:10-22:20&time=22:30-23:00";
NSData *timeData = [timeStrdataUsingEncoding:NSUTF8StringEncoding];
request.HTTPBody = timeData;
然后就TM成功了!!!!! 这个方法我用的是官方的网络请求方法。
完整代码如下:
NSString *URLStr = [NSStringstringWithFormat:@"%@/mobile/expert/time/setting",kBaseURL];
/*
NSDictionary *parameters = @{@"time" : @[@"09:00-1200", @"14:00-18:00", @"20:00-22:00"]};
AFN 转换之后HTTPBody -> time%5B%5D=09%3A00-1200&time%5B%5D=14%3A00-18%3A00&time%5B%5D=20%3A00-22%3A00 格式服务器无法识别
*/
// NSDictionary *parameters =@{@"time" :@[@"09:00-1200",@"14:00-18:00",
@"20:00-22:00"]};
//AFN的方法
// NSMutableURLRequest *realRequest = [[AFHTTPRequestSerializer serializer]requestWithMethod:@"POST" URLString:URLStr parameters:parameters error:nil];
NSMutableURLRequest *request = [NSMutableURLRequestrequestWithURL:[NSURLURLWithString:URLStr]];
//头部参数 token
NSString *token = [MCFunctionreadUserLoginInfo][@"token"];
[request setValue:tokenforHTTPHeaderField:@"X-session-token"];
request.HTTPMethod =
@"POST";
// NSData *data = realRequest.HTTPBody;
// NSString *str = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
// MCLog(@"%@",str);
NSString *timeStr =@"time=07:00-10:00&time=14:00-17:00&time=21:00-22:00&time=22:10-22:20&time=22:30-23:00";
NSData *timeData = [timeStrdataUsingEncoding:NSUTF8StringEncoding];
request.HTTPBody = timeData;
NSOperationQueue *queue = [[NSOperationQueuealloc]init];
[NSURLConnectionsendAsynchronousRequest:request
queue:queue
completionHandler:^(NSURLResponse *response,NSData *data,
NSError *error){
if (error) {
NSLog(@"Httperror:%@%ld", error.localizedDescription,(long)error.code);
}else{
NSInteger responseCode = [(NSHTTPURLResponse *)responsestatusCode];
NSString *responseString = [[NSStringalloc]
initWithData:dataencoding:NSUTF8StringEncoding];
NSLog(@"HttpResponseCode:%ld", (long)responseCode);
NSLog(@"HttpResponseBody %@",responseString);
}
}];
上班时间匆匆写的,格式不好,将就将就哈。
相关文章推荐
- HTTP格式布局
- android.net.http.AndroidHttpClient Android6.0 API23以后失效
- 分组交换 的理解
- 完美配置Tomcat的HTTPS
- HTTP错误码集合,及错误原因
- java 发送http json请求
- 网络编程一
- 分享一个免费SSL证书申请网站,给网站开启https协议 | 张戈博客
- [ios]http无法链接
- Android上实现TCP&UDP的客户端和服务端
- 理解HTTP幂等性
- 关于启用 HTTPS 的一些经验分享
- Xcode7 使用NSURLSession发送HTTP请求的问题
- [疯狂Java]TCP:TCP协议的概念、Socket通信、超时等待
- Android学习之网络请求库Retrofit2
- 网络扫描(一)
- HttpClient使用详解
- TCP与UDP在socket编程中的区别
- Android判断网络状态并远程获取数据
- Httperf:测试服务器能承载的最大服务!!!