使用 RESTKIT 使用 Web 服务

Posted

技术标签:

【中文标题】使用 RESTKIT 使用 Web 服务【英文标题】:Consuming web service with RESTKIT 【发布时间】:2012-11-13 03:27:56 【问题描述】:

我是 RESTKIT 的初学者,最近才在 ray 的教程 http://www.raywenderlich.com/13097/intro-to-restkit-tutorial 的foursquare public api 上对其进行了测试。

虽然我明白了它的要点,但有些部分我不明白,并希望得到它的指针,以便我可以使用我自己的 Web 服务。

- (void)viewDidLoad

    [super viewDidLoad];

    RKURL *baseURL = [RKURL URLWithBaseURLString:@"https://api.Foursquare.com/v2"];
    RKObjectManager *objectManager = [RKObjectManager objectManagerWithBaseURL:baseURL];
    objectManager.client.baseURL = baseURL;

    RKObjectMapping *venueMapping = [RKObjectMapping mappingForClass:[Venue class]];
    [venueMapping mapKeyPathsToAttributes:@"name", @"name", nil];
    [objectManager.mappingProvider setMapping:venueMapping forKeyPath:@"response.venues"];

    [self sendRequest];

如何改变

[venueMapping mapKeyPathsToAttributes:@"name", @"name", nil];
[objectManager.mappingProvider setMapping:venueMapping forKeyPath:@"response.venues"];

适应我自己的webMethod? (我的webMethod如下图)

目前,我将文件上传到 IIS 以进行测试,并使用 IP 进行 Web 服务。 (我经常更换工作区,所以我将其指定为 myIPAddress 以便于沟通)

-- 我的服务代码(更改编辑:现在返回 JSON)

    [WebMethod]
    [ScriptMethod( ResponseFormat = ResponseFormat.Json)]
    public void testTextJSON()
    
        string text = "Testing for Json!";
        List<string> arrayList = new List<string>();
        arrayList.Add(text); 
        javascriptSerializer js = new JavaScriptSerializer();
        string name = js.Serialize(arrayList);  
        Context.Response.Write(name); 
    

返回 - ["Testing for Json!"]

编辑 - 我目前为 viewDidLoadsendRequest 更改的内容以测试我自己的服务

   - (void)viewDidLoad

    [super viewDidLoad];

    RKURL *baseURL = [RKURL URLWithBaseURLString:@"http://192.168.1.12"];
    RKObjectManager *objectManager = [RKObjectManager objectManagerWithBaseURL:baseURL];
    objectManager.client.baseURL = baseURL;

    RKObjectMapping *venueMapping = [RKObjectMapping mappingForClass:[venue class]];
    [venueMapping mapKeyPathsToAttributes:@"name", @"name", nil];


    [self sendRequest];

- (void)sendRequest


    RKObjectManager *objectManager = [RKObjectManager sharedManager];

    RKURL *URL = [RKURL URLWithBaseURL:[objectManager baseURL] resourcePath:@"/webService/webService1.asmx/testTextJSON"];
    objectManager.acceptMIMEType = RKMIMETypeJSON;
  objectManager.serializationMIMEType = RKMIMETypeJSON;
    [[RKParserRegistry sharedRegistry] setParserClass:[RKJSONParserJSONKit class] forMIMEType:@"text/plain"];

    [objectManager loadObjectsAtResourcePath:[NSString stringWithFormat:@"%@", [URL resourcePath]] delegate:self];

编辑 n+1 - 这是我的一些错误消息,也许有人可以告诉我出了什么问题?

2012-11-25 06:49:20.925 fourSquareAPI[352:12e03] *** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<__NSCFString 0x8354430> valueForUndefinedKey:]: this class is not key value coding-compliant for the key venues.'

如果我删除[objectManager.mappingProvider setMapping:venueMapping forKeyPath:@"venues"]; 我会得到 ​​p>

2012-11-25 06:52:47.495 fourSquareAPI[368:11603] response code: 200
2012-11-25 06:52:47.499 fourSquareAPI[368:12e03] W restkit.object_mapping:RKObjectMapper.m:87 Adding mapping error: Could not find an object mapping for keyPath: ''
2012-11-25 06:52:47.499 fourSquareAPI[368:12e03] E restkit.network:RKObjectLoader.m:231 Encountered errors during mapping: Could not find an object mapping for keyPath: ''
2012-11-25 06:52:47.502 fourSquareAPI[368:11603] Error: Could not find an object mapping for keyPath: ''

有人可以教我怎么做吗?任何帮助将不胜感激,我真的很想学习如何使用 RESTKIT 来使用 web 服务。

【问题讨论】:

【参考方案1】:

键路径response.venues 是相对于 JSON 或 XML 格式的服务器响应的属性的路径。在这种情况下,服务器返回具有键“venues”的“response”。这很可能是您将应用映射的场所列表。您必须根据您的服务器响应进行调整。

如果你想在映射之前处理一个特定的值,使用这个函数:

- (void)objectLoader:(RKObjectLoader *)loader willMapData:(inout __autoreleasing id *)mappableData; 
  if([*mappableData valueForKey:@"result"] != nil)
    [*mappableData removeObjectForKey:@"result"]; //This key won't be mapped now
  

【讨论】:

那么假设我的服务返回一个简单的字符串,我还需要密钥路径吗? 映射是基于键值对完成的。如果服务器只返回一个值,则不会被映射。 我明白了,非常感谢!教程解释倾向于跳过这些细节和信息,即使在阅读和实践之后也无法理解大部分组件。 没问题!如果您的应用程序将使用来自服务器的大量数据,我强烈建议将所有内容格式化为 JSON 或 XML。它会让你的生活变得更轻松。 对不起,还有一个问题。我们必须手动将格式设置为 JSON 吗?还是返回数据自动设置为 JSON。我知道 RestKit 有 JSON 解析器,但不确定服务返回数据格式。

以上是关于使用 RESTKIT 使用 Web 服务的主要内容,如果未能解决你的问题,请参考以下文章

RestKit 的词法解析器问题

使用 RESTKIT 使用 Web 服务

使用 RestKit 同时调用两个 web 服务

不使用 Web 服务时如何使用来自 RestKit 的核心数据?

通过 NSURLconnection 为 ios Web 服务使用 Web 服务库(RESTKIT/ASIHTTP 请求)的优点

使用restkit api目标c调用Web服务时出错