Jsonp 数据格式,是前端js调用的函数片段,用于跨域。网上找了很多,似乎都没有iOS端的使用方法。
下面简单的说明一下iOS获取Jsonp 数据的注意事项,以及它的请求解析方法。
获取数据方法一:AFN请求,记得响应序列化responseSerializer 设置为 AFHTTPRequestSerializer,否则返回格式非json,会导致请求失败。在此,就不放代码了。
获取数据方法二:NSURLSession
NSURLSession *session = [NSURLSession sharedSession];
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:urlString] cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:30];
NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
if (data && (error == nil)) {
// 网络访问成功
} else {
// 网络访问失败
NSLog(@"error=%@",error);
}
}];
[task resume];
如何解析呢?我给简单的封装了一个方法。preMethod是jsonp 外面的字符串。比如:callback({字典json串});,那么preMethod =callback 即可。如果使用过程中有什么疑问或者建议,可以在下方留言。
-(NSDictionary *)jsonpDataToDic:(NSData *)data preMethod:(NSString *)preMethod{
NSString *jsonp = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSInteger lenght = jsonp.length;
NSString *startJsonp = preMethod;
NSInteger startLenght = startJsonp.length+1;//1是左边括号
if (lenght>startLenght+1) {
NSString *json =[jsonp substringWithRange:NSMakeRange(startLenght,lenght-startLenght-1)];
NSData *jsonData = [json dataUsingEncoding:NSUTF8StringEncoding];
NSError *err;
NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:jsonData
options:NSJSONReadingMutableContainers
error:&err];
return dic;
}
return nil;
}