在 iOS 中使用扭曲的 JSON 调用 Web 服务
Posted
技术标签:
【中文标题】在 iOS 中使用扭曲的 JSON 调用 Web 服务【英文标题】:Calling a Web Service with a warped JSON in iOS 【发布时间】:2016-01-19 09:38:56 【问题描述】:我使用这种类型的函数从我的 ios 应用程序调用我的 Web 服务:
-(NSData *)getMainMenuJsonData
NSString *urlAsString = [NSString stringWithFormat:@"%@%@/%@/%@",[configs valueForKey:@"wsURL"], [configs valueForKey:@"clientToken"], [configs valueForKey:@"appToken"], [CommonsUtils getCommonUtil].getAppLanguage];
NSString* webStringURL = [urlAsString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSURLRequest * urlRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:webStringURL] cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:2.5];
NSURLResponse * response = nil;
NSError * error = nil;
NSData * data = [NSURLConnection sendSynchronousRequest:urlRequest returningResponse:&response error:&error];
NSUInteger statusCode = ((NSHTTPURLResponse *)response).statusCode;
if (statusCode == 200 && error == Nil)
if (error != Nil)
return Nil;
else
return data;
else
return Nil;
据我了解,我发送的内容如下:
http://myserver.com/WSFunction/Parameter1/Parameter2 等等。
这对我来说是个问题,因为如果我需要添加 1 个参数,我必须创建另一个具有几乎相同功能但使用新参数的服务,即:
http://myserver.com/WSFunction/Parameter1/Parameter2/Parameter3
我的想法是始终调用相同的 Web 服务,但传递服务的版本和带有我需要的所有参数的 JSON,但据我所知,我必须扭曲消息中的 JSON(也许这个不是正确的词,这也许就是我在 Google 中找不到任何东西的原因),所以最后我会用类似的东西结束:
http://myserver.com/WSVersionNumber/[SerializedJSON]
在服务器中我会有这样的逻辑:
案例:“版本 1”
反序列化 JSON 并使用 Parameter1 和 Parameter2
案例:“版本 2”
反序列化 JSON 并使用 Parameter1 和 Parameter2 和 Parameter3
最后我想要在 iOS 中做这样的事情:
-(NSData *)getMainMenuJsonData
NSString *urlAsString = @"http://myserver.com/WSVersionNumber/"
NSURLRequest * urlRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:webStringURL] cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:2.5];
[urlRequest setParameterName:@"SerializedJSON" withValue:SerializedJSONVar];
NSURLResponse * response = nil;
NSError * error = nil;
NSData * data = [NSURLConnection sendSynchronousRequest:urlRequest returningResponse:&response error:&error];
NSUInteger statusCode = ((NSHTTPURLResponse *)response).statusCode;
if (statusCode == 200 && error == Nil)
if (error != Nil)
return Nil;
else
return data;
else
return Nil;
有没有办法在 iOS 中做这样的事情?我对使用第三方库不感兴趣,因为这是企业政策。
提前致谢。
【问题讨论】:
【参考方案1】:请检查一下,这个链接可能对你有帮助,
本示例使用 ASIHTTPRequest,非常简单有效的方式处理 JSON。
https://***.com/a/7928734/4852079
【讨论】:
【参考方案2】:感谢 Tejas Patel 发布的答案让我找到了正确的信息。
代码是这样结束的:
-(NSData *)getLogin:(NSMutableDictionary *)pData
NSString *tUrlAsString = [NSString stringWithFormat:@"%@%@/%@/%@/GetLogin",[_Configs valueForKey:@"wsURL"], [_Configs valueForKey:@"wsVersion"], [_Configs valueForKey:@"clientToken"], [CommonsUtils getCommonUtil].getAppLanguage];
NSString* tWebStringURL = [tUrlAsString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSMutableURLRequest * tUrlRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:tWebStringURL] cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:2.5];
[tUrlRequest setHTTPMethod:@"POST"];
[tUrlRequest setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
NSData *tJsonData;
if ([NSJSONSerialization isValidJSONObject:pData])
NSError *tError;
tJsonData = [NSJSONSerialization dataWithJSONObject:pData options:NSJSONWritingPrettyPrinted error:&tError];
if (!tJsonData)
NSLog(@"json Data %@",tError.description);
return Nil;
else
NSString *tJSONString = [[NSString alloc] initWithBytes:[tJsonData bytes] length:[tJsonData length] encoding:NSUTF8StringEncoding];
NSLog(@"JSON String %@",tJSONString);
[tUrlRequest setHTTPBody:tJsonData];
NSURLResponse * tResponse = nil;
NSData * tData = [NSURLConnection sendSynchronousRequest:tUrlRequest returningResponse:&tResponse error:&tError];
NSUInteger tStatusCode = ((NSHTTPURLResponse *)tResponse).statusCode;
if (tStatusCode == 200 && tError == Nil)
if (tError != Nil)
return Nil;
else
return tData;
else
return Nil;
else
NSLog(@"This Data can't be serialized");
return Nil;
最后,您只需在 setHTTPBody 中添加一个 JSON,因此在您的 REST 服务中,您必须接收具有相同名称的 JSON 的所有节点的变量。
我希望这对将来的某人有所帮助。
问候。
【讨论】:
以上是关于在 iOS 中使用扭曲的 JSON 调用 Web 服务的主要内容,如果未能解决你的问题,请参考以下文章
iOS - 在 Swift 中调用 Webservice 并解析 JSON
如何调用 Web Service json 目标 C iOS 来调用函数