在 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 来调用函数

Xcode9.2 构建版本显示在 ios8.1 中扭曲的图像

Xcode 9 - iOS 8 图像变得奇怪扭曲

扭曲的 I/O 归档文件

调用 WCF Web 服务时出现错误的 Json 响应