13

我正在编写一个 ios 应用程序,它使用 restkit 通过带有 JSON 的 Rest 与 Web 服务器进行通信

我可以使用 [[RKObjectManager sharedManager] loadObjectsAtResourcePath:path delegate:self] 从我的 Web 服务获取对象作为 JSON,将其映射到 obj-c 对象,它工作正常

现在我正在尝试使用: [[RKObjectManager sharedManager] putObject:obj delegate:self]; 并且这个调用将一个对象作为表单编码而不是 JSON 发送到 Web 服务

所以我的问题是:如何配置 sharedManager(或 routeur?)以内容类型 JSON 而不是编码形式发送。

任何代码示例都非常感谢。

谢谢!

4

5 回答 5

9

最简单的方法是在初始化对象管理器时简单地设置属性,如下所示:

RKObjectManager* objectManager = [RKObjectManager objectManagerWithBaseURL:@"http://url.com"];
objectManager.serializationMIMEType = RKMIMETypeJSON;
于 2011-08-12T01:31:42.897 回答
3

Evan 是正确的,但我还必须确保我发送的是 JSON 字符串,因为我有一个嵌套的 NSDictionay。

如果你有一个字典想要作为 JSON 字符串发送,你可以这样做:

// create a JSON string from your NSDictionary
NSError *error; 
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dict 
                                                   options:NSJSONWritingPrettyPrinted // Pass 0 if you don't care about the readability of the generated string
                                                     error:&error];
NSString *jsonString = [[NSString alloc] init];
if (!jsonData) {
    NSLog(@"Got an error: %@", error);
} else {
    jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
}

// make the post using the objectManager if you want to map the response to a model
RKObjectManager* objectManager = [RKObjectManager sharedManager];  
[objectManager loadObjectsAtResourcePath:@"/api/" delegate:self block:^(RKObjectLoader* loader) {
    loader.serializationMIMEType = RKMIMETypeJSON; // We want to send this request as JSON
    loader.objectMapping = [objectManager.mappingProvider objectMappingForClass:[Plan class]];
    loader.resourcePath = @"/api/";
    loader.method = RKRequestMethodPOST;
    loader.params = [RKRequestSerialization serializationWithData:[jsonString dataUsingEncoding:NSUTF8StringEncoding] MIMEType:RKMIMETypeJSON];
}];
于 2012-04-25T18:25:31.890 回答
1

创建对象管理器并设置属性以匹配 JSON 格式的标头

RKObjectManager *objectManager = [RKObjectManager managerWithBaseURL:[NSURL URLWithString:@"http://mobile.com"]];
[objectManager addResponseDescriptorsFromArray:@[responseDescriptor]];

objectManager.requestSerializationMIMEType = RKMIMETypeJSON;
于 2013-10-15T16:06:04.427 回答
1

好的,刚刚找到了如何做到这一点:

子类 RKRouter.h 或只是更改 RKDynamicRouter.m

return [object propertiesForSerialization];

[RKJSONSerialization JSONSerializationWithObject:[object propertiesForSerialization]];

和 RestKit 为 putObject 调用生成 JSON

于 2011-03-16T04:43:32.047 回答
0

您可以通过继承 RKObjectManager 并更改 requestWithObject:method:path:parameters: 在子类管理器中的实现来更改单个请求的 serializationMIMEType。

发送请求:

SubclassedObjectManager *manager = ...
[manager putObject:nil
           path:pathString
     parameters:parameters
        success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
      } failure:^(RKObjectRequestOperation *operation, NSError *error) {
      }
 ];

修改 PUT 方法请求的 MIMEType:

- (NSMutableURLRequest *)requestWithObject:(id)object method:(RKRequestMethod)method path:(NSString *)path parameters:(NSDictionary *)parameters
{
  NSMutableURLRequest *request = [super requestWithObject:object method:method path:path parameters:parameters];
  if (method&RKRequestMethodPUT) {
    NSError *error = nil;
    NSData *serializedJSON = [RKMIMETypeSerialization dataFromObject:parameters MIMEType:RKMIMETypeJSON error:&error];
    [request setValue:RKMIMETypeJSON forHTTPHeaderField:@"Content-Type"];
    [request setHTTPBody:serializedJSON];
  }

  return request;
}
于 2013-10-10T07:24:56.433 回答