2013-06-29 2 views
1

Я пытаюсь связать RestKit с REST API, созданным Django-Tastypie. GET операции работают хорошо, но POST операции имеют странное поведение: строка создается в базе данных, но все поля пустые.Операция Reskit POST не работает должным образом (ошибка 1016)

Я RestKit на версии 0.20.3-dev

Вот мой код (непосредственно скопирована с here):

RKObjectMapping *responseMapping = [RKObjectMapping mappingForClass:[User class]]; 
[responseMapping addAttributeMappingsFromArray:@[@"pseudo", @"email", @"password"]]; 
NSIndexSet *statusCodes = RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful); // Anything in 2xx 
RKResponseDescriptor *userDescriptor2 = [RKResponseDescriptor responseDescriptorWithMapping:responseMapping pathPattern:@"/user" keyPath:@"objects" statusCodes:statusCodes]; 

RKObjectMapping *requestMapping = [RKObjectMapping requestMapping]; // objectClass == NSMutableDictionary 
[requestMapping addAttributeMappingsFromArray:@[@"pseudo", @"email", @"password"]]; 

RKRequestDescriptor *requestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:requestMapping objectClass:[User class] rootKeyPath:@"objects"]; 

RKObjectManager *manager = [RKObjectManager managerWithBaseURL:[NSURL URLWithString:@"http://127.0.0.1:8000"]]; 
[manager addRequestDescriptor:requestDescriptor]; 
[manager addResponseDescriptor:userDescriptor2]; 

// Tastypie error without this line 
manager.requestSerializationMIMEType = RKMIMETypeJSON; 

// This line changes nothing 
[manager setAcceptHeaderWithMIMEType:RKMIMETypeJSON]; 

User *user = [User new]; 
user.pseudo = @"test"; 
user.email = @"[email protected]"; 
user.password = @"test"; 

[manager postObject:user path:@"/api/v1/user/" parameters:nil success:nil failure:nil]; 

И это ошибки я получаю:

2013-06-29 02:18:21.882 test_restkit[40395:c07] I restkit:RKLog.m:34 RestKit logging initialized... 2013-06-29 02:18:21.930 test_restkit[40395:c07] I restkit.network:RKObjectRequestOperation.m:180 GET 'http://127.0.0.1:8000/api/v1/post/' 2013-06-29 02:18:21.930 test_restkit[40395:c07] I restkit.network:RKObjectRequestOperation.m:180 POST 'http://127.0.0.1:8000/api/v1/user/' 2013-06-29 02:18:21.965 test_restkit[40395:4c03] E restkit.network:RKObjectRequestOperation.m:576 Object request failed: Underlying HTTP request operation failed with error: Error Domain=org.restkit.RestKit.ErrorDomain Code=-1016 "Expected content type {(
    "application/x-www-form-urlencoded", 
    "application/json")}, got text/html" UserInfo=0xa8437b0 {AFNetworkingOperationFailingURLRequestErrorKey=<NSMutableURLRequest http://127.0.0.1:8000/api/v1/user/>, NSErrorFailingURLKey=http://127.0.0.1:8000/api/v1/user/, NSLocalizedDescription=Expected content type {(
    "application/x-www-form-urlencoded", 
    "application/json")}, got text/html, AFNetworkingOperationFailingURLResponseErrorKey=<NSHTTPURLResponse: 0x95866b0>} 2013-06-29 02:18:21.966 test_restkit[40395:4c03] E restkit.network:RKObjectRequestOperation.m:243 POST 'http://127.0.0.1:8000/api/v1/user/' (201 Created/0 objects) [request=0.0304s mapping=0.0000s total=0.0402s]: Error Domain=org.restkit.RestKit.ErrorDomain Code=-1016 "Expected content type {(
    "application/x-www-form-urlencoded", 
    "application/json")}, got text/html" UserInfo=0xa8437b0 {AFNetworkingOperationFailingURLRequestErrorKey=<NSMutableURLRequest http://127.0.0.1:8000/api/v1/user/>, NSErrorFailingURLKey=http://127.0.0.1:8000/api/v1/user/, NSLocalizedDescription=Expected content type {(
    "application/x-www-form-urlencoded", 
    "application/json")}, got text/html, AFNetworkingOperationFailingURLResponseErrorKey=<NSHTTPURLResponse: 0x95866b0>} 2013-06-29 02:18:22.023 test_restkit[40395:1703] I restkit.network:RKObjectRequestOperation.m:250 GET 'http://127.0.0.1:8000/api/v1/post/' (200 OK/4 objects) [request=0.0816s mapping=0.0109s total=0.1023s] 

Кто-то уже сталкивался с такого рода проблемы?

Thx для вашей помощи.

EDIT:

Вот много журналов с лесозаготовок трассировки позволяют:

2013-06-29 13:03:28.554 test_restkit[42627:c07] D restkit.object_mapping:RKMappingOperation.m:1021 Finished mapping operation successfully... 
2013-06-29 13:03:28.562 test_restkit[42627:c07] T restkit.network:RKObjectRequestOperation.m:178 POST 'http://127.0.0.1:8000/api/v1/user/': 
request.headers={ 
    Accept = "application/json"; 
    "Accept-Language" = "en;q=1, fr;q=0.9, de;q=0.8, ja;q=0.7, nl;q=0.6, it;q=0.5"; 
    "Content-Type" = "application/json; charset=utf-8"; 
    "User-Agent" = "test_restkit/1.0 (iPad Simulator; iOS 6.1; Scale/1.00)"; 
} 
request.body={"objects":{"password":"test","pseudo":"test","email":"[email protected]"}} 

EDIT 2:

Изменяя эту строку:

RKRequestDescriptor *requestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:requestMapping objectClass:[User class] rootKeyPath:@"objects"]; 

по

RKRequestDescriptor *requestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:requestMapping objectClass:[User class] rootKeyPath:nil]; 

Строка создана и поле правильно заполнено. Но я все еще получаю ошибку типа контента

+0

Что ожидает сервер? Кроме того, сервер должен отвечать с помощью JSON, но на самом деле он отправляет текст (возможно, сообщение об ошибке, но не показано). Включите ведение журнала трассировки и добавьте блоки сбоев с протоколированием. – Wain

+0

Я отредактировал мое сообщение с протоколом отслеживания. Я также добавляю блоки ошибок с протоколированием, но ошибка такая же, как и в моем сообщении. – Yaman

+0

Цель состоит в том, чтобы получить текст ошибки, отправленный сервером обратно, где он должен сказать вам, что не так. Пока вы не знаете, что не можете знать, что исправить. – Wain

ответ

1

Ошибка только в том, что вы сообщаете RestKit, что ожидаете получить JSON, но сервер не отправляет JSON (или, по крайней мере, не устанавливает правильный заголовок). Лучший способ решить проблему - изменить заголовки на ответе сервера, чтобы он возвращал JSON. Кроме того, сообщите RestKit, чтобы он не ожидал получить JSON.

+0

Хорошо, что я плохой, я неправильно понял ваши последние комментарии ... Как вы указали, мой сервер не отвечал в JSON, а в HTML. Мне нужно было добавить 'always_return_data = True' на Tastypie и соответствующим образом изменить свой RKResponseDescriptor. Thx для вашей помощи @Wain. – Yaman

+1

и как я могу сказать, что restkit не ожидал получить JSON? я не имею контроля над заголовками возврата api. Я также заметил, что изменение запроса 'RKObjectManager'SerializationMIMEType' не имеет никакого значения. Я смотрю на неправильное место? – abbood

+1

Я даже попробовал [setAcceptHeaderWithMIMEType] (https://github.com/RestKit/RestKit/blob/development/Code/Network/RKObjectManager.h?source=c) на '@" text/html ", но не повезло .. это странно b/c в моих других проектах, это сработало, когда я использовал это с AFNetworking (т.е. без вещей restkit) – abbood