您的位置:首页 > 理论基础 > 计算机网络

iOS 网络问题

2016-03-23 14:58 344 查看
iOS 网络问题
最近一直在独立负责一个项目,碰到了一些网络问题,之前一直是使用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);

}

}];

上班时间匆匆写的,格式不好,将就将就哈。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: