2013-12-17 3 views
2

Я пытаюсь отправить объект с прикрепленным файлом.Опубликовать JSON Body + MultiPart RestKit 0.2x не удается

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; 

[EDIT]

Мой объект mapepd является SynchDocObj:

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

Проблема заключается в том:

1) В RKlogs, то request.body = null и объект JSON, помещают в форм-данных

2) Сервер не может декодировать тело, потому что это null

Мой вопрос:

1) Я отправляю объект JSON не так?

2) Если да, то как я могу отправить объект JSON с загрузкой файла, то есть в виде многостраничного запроса? С уважением!

[РЕШЕНИЕ]

В соответствии с предложением ответа, я считаю, что решение 1) извлечения отображенный объект из форм-данных, а не тело; 2) ИЛИ отправить объект nil и поместить строку JSON в данные формы.

+0

Я не уверен, вы можете отправить JSON и файл. Файл поддерживается форматированным URL-адресом, а не JSON. – Wain

+0

Итак, вы говорите, что в RestKit невозможно сделать что-то вроде этого http://stackoverflow.com/questions/9081079/rest-http-post-multipart-with-json – giuseppe

+0

Это отличается от того, что предлагает ваш вопрос. Это то, что вы хотите (сформировать закодированный запрос с помощью JSON в одной части). Это можно сделать, это всего лишь несколько шагов ... – Wain

ответ

3

Это:

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

это 2 разные способы сказать то же самое - и вы не хотите, чтобы любой из них. Вам необходимо отправить запрос в виде URL-адреса формы (значение по умолчанию).

Проще всего сделать, чтобы использовать ту же форму, что и в вашем текущем коде, чтобы создать запрос, сгенерировать JSON раньше, а затем использовать appendPartWithFormData:name:, чтобы добавить его в запрос (непосредственно перед добавлением файла).

Для создания JSON вы можете использовать RestKit (RKMappingOperation) или просто создать словарь/массив контента, а затем использовать NSJSONSerialization для сериализации того объекта, который будет добавлен в запрос.

+0

Не могли бы вы рассказать мне, как использовать сопоставление? У меня есть сопоставленный объект SynchObj. – giuseppe

+0

Это управляемый объект или равнина? Если вы управляете, вы должны предоставить 'dataSource' для операции сопоставления ... – Wain

+0

plain ..но я думаю, что мне не нужно делать то, что вы предлагаете. На самом деле, в формах-данных у меня есть все сопоставленные объекты ... – giuseppe

0

Анализ мой код, он работает как шарм:

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; 
} 
Смежные вопросы