gpt4 book ai didi

iphone - RestKit GET 查询参数

转载 作者:可可西里 更新时间:2023-11-01 03:49:51 24 4
gpt4 key购买 nike

我已经使用 RestKit 0.10.0 一段时间了,直到现在,我只将序列化的对象发布到我的服务器:

[[RKObjectManager sharedManager] postObject:serializedObject
usingBlock:^(RKObjectLoader *loader) {
loader.delegate = self;
loader.objectMapping = responseMapping;
loader.serializationMIMEType = RKMIMETypeFormURLEncoded;
loader.targetObject = nil;
}];

到目前为止,还不错。但是我现在需要使用一些查询参数向服务器发出 GET 请求。第一个自然而然想到的事情就是像我发布对象那样做:

  • 为封装查询参数的对象创建序列化映射
  • 为从服务器接收到的对象创建一个响应映射
  • 为 RKRequestMethodGET 定义并使用路由器(而不是 RKRequestMethodPOST)
  • 使用 getObject:usingBlock(而不是 postObject:usingBlock)发出请求

我很快发现这不是解决问题的方法,所以在搜索可用资源(RestKit WikiRestKit Google group)后,我现在知道了两个被认为有效的解决方案:

  • 将查询参数附加到资源路径。

这非常有效。

NSDictionary *queryParams = [NSDictionary dictionaryWithObjectsAndKeys:
token, @"accessToken",
[NSNumber numberWithInt:level], @"level",
[NSNumber numberWithInt:count], @"count",
nil];

NSString* resourcePath = [PEER_SUGGESTIONS_CONTROLLER_PATH stringByAppendingQueryParameters:queryParams];

[[RKObjectManager sharedManager] loadObjectsAtResourcePath:resourcePath
usingBlock:^(RKObjectLoader *loader) {
loader.delegate = self;
loader.objectMapping = responseMapping;
}];
  • 在加载程序 block 中设置查询参数。

这不会发送查询参数。

RKParams *params = [RKParams params];
[params setValue:token forParam:@"accessToken"];
[params setValue:[NSNumber numberWithInt:level] forParam:@"level"];
[params setValue:[NSNumber numberWithInt:count] forParam:@"count"];

[[RKObjectManager sharedManager] loadObjectsAtResourcePath:PEER_SUGGESTIONS_CONTROLLER_PATH
usingBlock:^(RKObjectLoader *loader) {
loader.delegate = self;
loader.objectMapping = responseMapping;
loader.params = params;
}];

我的问题是:

  1. 为什么第二种解决方案不起作用?
  2. 为什么第一个解决方案无需将 loader.targetObject 设置为 nil 就可以工作,尽管我在 JSON 响应中没有任何根键路径?
  3. 我应该在什么情况下使用 getObject:usingBlock 方法?它的预期目的是什么?
  4. 我应该使用 loader.params 做什么?来自 wiki 的对象映射教程说此属性可用于封装 POST 参数,但我不明白这一点,因为我可以将参数包装在使用 postObject:usingBlock 方法发送的序列化对象中。

谢谢。

[稍后编辑]

关于我的第二个问题的答案:在发出 POST 请求时,我一直在加载程序 block 中将 targetObject 设置为 nil,因为否则 RestKit 将尝试使用发送对象映射作为响应(检查此 link 以获取相关信息讨论)。但是由于我使用的是 loadObjectsAtResourcePath:usingBlock:,因此没有对象被发送,因此响应将自然地映射到响应映射上,而不必将 targetObject 设置为 nil。

最佳答案

  1. Why doesn't the second solution work?

params 用于创建 HTTP 正文,不用于 GET/HEAD 请求。

  1. Why is the first solution working without having to set the loader.targetObject to nil, although I do not have any root key path in the JSON response?

我认为 targetObject 默认为 nil。您通常不设置它,请求将在需要时创建它。我唯一一次使用它是在请求没有主键的对象或其他奇怪问题时。

  1. What are the cases where I should use the getObject:usingBlock method? What is its intended purpose?

这是一种方便的方法,因此您不必记住所有正确的语法。在内部,它只是使用 GET 发送一个对象加载请求。

编辑:

如果您有要更新的对象,请使用它。

  1. What should I use loader.params for? The object mapping tutorial from the wiki says this property can be used to encapsulate POST parameters, but I do not see the point since I can wrap the parameters in the serialized object that is being sent with the method postObject:usingBlock.

无论您在参数中输入什么,都将被序列化为 HTTP 正文(或正文流)。同样,postObject:usingBlock: 只是一种方便的方法,因此您不必记住所有内容。

RestKit 是开源的。如果您不确定它是如何工作的,您可以在内部自由地遵循参数。如果您的应用程序和 Web 服务设计良好,您应该能够使用这些便捷方法。有时您不能,然后您可以像以前一样使用原始表格。

编辑:Q Hrm,引用你的要点搞砸了数字......

关于iphone - RestKit GET 查询参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11227255/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com