【问题标题】:Post JSON Body + MultiPart RestKit 0.2x failsPost JSON Body + MultiPart RestKit 0.2x 失败
【发布时间】:2013-12-17 18:16:45
【问题描述】:

我正在尝试发布带有附件的对象。

 NSMutableURLRequest *request =
            [objectManager multipartFormRequestWithObject:reqDocObj
                                                   method:RKRequestMethodPOST
                                                     path:@"syncDocument.json"
                                               parameters:nil
                                constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
                                    [formData appendPartWithFileData:UIImagePNGRepresentation([UIImage imageNamed:@"graybox.png"])
                                                                name:@"image"
                                                            fileName:@"some_file"
                                                            mimeType:@"image/jpeg"];

            }];



RKObjectRequestOperation *operation =
            [objectManager
             objectRequestOperationWithRequest:request
                                       success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {


                                       }  
                                    failure:^(RKObjectRequestOperation *operation, NSError *error) {
                                                          NSLog(@"WS: errore operazione di richiesta %@",error);


                                        }  
             ];  


            [objectManager enqueueObjectRequestOperation:operation];

objectManager 配置为:

    [objectManager setAcceptHeaderWithMIMEType:RKMIMETypeJSON];
    [objectManager setRequestSerializationMIMEType:RKMIMETypeJSON];
    objectManager.requestSerializationMIMEType = RKMIMETypeJSON;

[编辑]

我的 mapepd 对象是SynchDocObj:

requestDocMapping = [RKObjectMapping mappingForClass:[SynchDocObj class]];
[requestDocMapping addAttributeMappingsFromDictionary:mappingDocDict];

问题是:

1)在RKlogs中,request.body = null和JSON对象被放入form-data中

2) 服务器无法解码正文,因为它是null

我的问题是:

1) 我是否以错误的方式发送 JSON 对象?

2) 如果是,我如何发送带有文件上传的 JSON 对象,即作为多部分请求? 问候!

[解决方案]

按照答案的建议,我认为解决方案是 1)从表单数据而不是正文中检索映射对象; 2) 或发布一个 nil 对象并将 JSON 字符串放入表单数据中。

【问题讨论】:

  • 我不确定您是否可以发送 JSON 和文件。该文件由表单 URL 编码格式支持,而不是 JSON。
  • 所以你是说,在 RestKit 中,不可能做这样的事情stackoverflow.com/questions/9081079/…
  • 这与您的问题所暗示的不同。那是您想要的吗(在一部分中使用 JSON 形成编码请求)。是可以做到的,只需要几步……
  • 是的,我会这样做...

标签: ios restkit restkit-0.20


【解决方案1】:

这个:

[objectManager setRequestSerializationMIMEType:RKMIMETypeJSON];
objectManager.requestSerializationMIMEType = RKMIMETypeJSON;

有两种不同的方式来表达同一件事 - 你不想拥有它们中的任何一种。您需要以表单 URL 编码的形式发送请求(默认值)。

最简单的做法是使用与当前代码相同的表单来创建请求,提前生成 JSON,然后使用 appendPartWithFormData:name: 将其添加到请求中(就在添加文件之前)。

要生成 JSON,您可以使用 RestKit (RKMappingOperation),或者您可以创建一个字典/内容数组,然后使用 NSJSONSerialization 序列化该对象以添加到请求中。

【讨论】:

  • 您能告诉我如何使用映射吗?我有一个映射对象 SynchObj。
  • 它是托管对象还是普通对象?如果管理,您必须为映射操作提供dataSource...
  • plain..但我认为我不需要按照你的建议去做。事实上,在表单数据中我有所有映射的对象......
  • 使用您当前的代码 RestKit 正在创建 JSON,但您需要它来创建表单编码的 POST,因此您需要单独创建 JSON。
  • 是的,你是对的。我想我会删除这个问题....谢谢你的时间,真的!
【解决方案2】:

分析我的代码,它就像一个魅力:

RKRequestDescriptor *requestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:[FilledExamCard defineMapping] objectClass:[MappedClassName class] rootKeyPath:nil method:RKRequestMethodPUT];

    NSData *jsonPayload = [self getJSONpayloadFromObject:mappedClassObject requestDescriptor:requestDescriptor];

    NSURL *baseURL = [NSURL URLWithString:[ZDR_BASE_URL stringByAppendingString:@"PutExamCards"]];

    AFHTTPClient *client = [AFHTTPClient clientWithBaseURL:baseURL];

    [RKMIMETypeSerialization registerClass:[RKNSJSONSerialization class] forMIMEType:@"text/plain"];
    [client setDefaultHeader:@"Accept" value:@"text/plain"];

    RKObjectManager *objectManager = [[RKObjectManager alloc] initWithHTTPClient:client];
    [objectManager setRequestSerializationMIMEType: RKMIMETypeJSON];
    [objectManager addRequestDescriptor:requestDescriptor];

    NSMutableURLRequest *request = [objectManager multipartFormRequestWithObject:nil method:RKRequestMethodPUT path:@"" parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {

        // Name may vary depending from server settings
        [formData appendPartWithFormData:jsonPayload name:@"model"];
    }];


    RKObjectRequestOperation *operation = [objectManager objectRequestOperationWithRequest:request success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {

        // Process data 

    } failure:^(RKObjectRequestOperation *operation, NSError *error) {

        // An error occurred

    }];

-(NSData*)getJSONpayloadFromObject:(NSObject*)object requestDescriptor:(RKRequestDescriptor*)requestDescriptor
{
    NSDictionary *paramObject = [RKObjectParameterization parametersWithObject:object requestDescriptor:requestDescriptor error:nil];

    NSError *error;
    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:paramObject options:NSJSONWritingPrettyPrinted error:&error];

    return jsonData;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-11
    • 1970-01-01
    • 2013-03-29
    相关资源
    最近更新 更多