在iOS

时间:2016-01-19 09:38:56

标签: ios json web-services rest

我使用这种类型的功能从我的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中做这样的事情?我对使用第三方库这样做不感兴趣,因为这是企业政策。

提前致谢。

2 个答案:

答案 0 :(得分:1)

请检查,可能此链接会帮助您,

这个例子使用ASIHTTPRequest,非常简单有效地处理JSON。

https://stackoverflow.com/a/7928734/4852079

答案 1 :(得分:0)

感谢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的所有节点,这些节点具有相同的变量名称。

我希望将来可以帮助某人。

问候。