RestKit обрабатывает различные коды состояния HTTP - PullRequest
2 голосов
/ 02 октября 2011

Я только начал пробовать RestKit для приложения для iOS, которое я создаю. Я обычно использую ASIHttpRequest, но я хочу протестировать RestKit в основном для его сопоставления объектов между JSON и CoreData. Есть кое-что замечательное в RestKit, но я столкнулся с проблемой, которая действительно заставляет его чувствовать себя неполноценным, если я не делаю что-то неправильно или что-то упустил. Я надеюсь, что кто-то здесь может помочь мне в этом.

Я использую RKObjectLoader для асинхронных и синхронизирующих вызовов REST API. Мой сервис предназначен для отправки правильных кодов состояния HTTP вместе с неким описанием, 401 является примером того, когда API требуется аутентифицированный пользователь.

Моя проблема в том, что RestKit перестает работать нормально, если я получаю обратно ошибку 401. Объект RKResponse имеет код состояния 0, хотя в нем есть полезная нагрузка. Я почти уверен, что это связано с плохой обработкой HTTP-статусов NSURLConnection, но я ожидаю, что RestKit каким-то образом обойдет это. Тем более, что класс RKResponse имеет довольно много функций-оболочек для определения кода состояния ответа (isOK, isCreated, isForbidden, isUnauthorized и т. Д.).

Для сравнения, ASIHttpRequest не использует NSURLConnection, но вместо этого использует код CFNetwork более низкого уровня. ASIHttpRequest позволяет мне точно видеть, что вернулось через HTTP, без отправки ошибок влево и вправо.

Вопрос в том, что я делаю что-то не так, или это ожидаемое поведение из RestKit? Кто-нибудь успешно смог позвонить в [RKResponse isAuthenticated]? Хотя для меня это и не доказывает, есть ли какая-то разница между работой в асинхронном режиме и в режиме синхронизации в этом отношении. Я где-то читал, что NSURLConnection, запущенный в режиме синхронизации, будет действовать немного по-другому, даже если базовый код просто вызывает асинхронные операции. Связано ли это с тем, что я использую RKObjectLoader, а не просто RKRequest? Возможно, тот факт, что полезная нагрузка не может быть сопоставлена ​​с моделью, вызывает гнев, но кажется, что код нарушается раньше в RKRequest.sendSynchronously, до того, как на самом деле происходит сопоставление.

Суть в том, что мой код должен иметь возможность свободно читать коды состояния HTTP. Любое руководство будет наиболее ценно.

Хайдер

Ответы [ 2 ]

2 голосов
/ 04 сентября 2013

Обычный способ для RestKit 0.20.x - создать подкласс RKObjectRequestOperation.Я написал статью об этой проблеме в блоге, которую можно найти здесь: http://blog.higgsboson.tk/2013/09/03/global-request-management-with-restkit/

0 голосов
/ 26 января 2012

См. http://groups.google.com/group/restkit/msg/839b84452f4b3e26

"... при сбое аутентификации вызов аутентификации отменяется, и запрос фактически аннулируется."

ОБНОВЛЕНИЕ:

RestKit ужевключает в себя метод делегата для этого:

(void)request:(RKRequest *)request didFailAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge;

Триггеры до

(void)objectLoader:(RKObjectLoader *)objectLoader didFailWithError:(NSError *)error

Когда не удается выполнить аутентификацию HTTP Basic, поэтому мы можем использовать ее вместо этого.

...