2013-05-23 4 views
0

Это мой код кода, выполняющий запрос GET для REST api.iOS HTTP-запрос - получение сообщения об ошибке

Я не уверен, как получить обратно сообщение, если я получаю сообщение об ошибке:

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; 
    NSURL *URL = [NSURL URLWithString:urlString]; 
    [request setURL:URL]; 
    [request setHTTPMethod:@"GET"]; 

    NSError *err = nil; 
    NSHTTPURLResponse *res = nil; 
    NSData *retData = [NSURLConnection sendSynchronousRequest:request returningResponse:&res error:&err]; 
    if (err) // This part is never called. 
    { 
     NSLog(@"Error: %@", err); 
    } 
    else 
    { 
     if (res.statusCode != 200) 
     { 
//   show the user the status message 
      NSLog(@"Error: %@", res); // This part is called 

     } 
     else 
     { 

     } 
    } 

Я хочу, чтобы получить сообщение об ошибке, если она не была успешной. Но блок if (err) никогда не вызывается. ошибка по-прежнему равна нулю, хотя код состояния равен 400.

И в случае успеха я верну ответ json.

В коде выше я получить обратно StatusCode 400

+0

Просто для калибровки, правильный URL и тестирование его с помощью другого приложения. Я получаю правильное сообщение о состоянии. Так что это работает, я просто не знаю, как получить сообщение в ios – Harry

ответ

0

Посмотрите на ссылки класса NSError:

https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSError_Class/Reference/Reference.html

Вы можете попытаться войти сообщение об ошибке от localizedDescription.

+0

Почему блок err не запускается? – Harry

+0

Я не могу этого сделать, потому что блок ошибки фактически не запускается. err is Null – Harry

+0

Можете ли вы проверить на retData, не является ли он, когда код статуса 400? –

0

вы получаете этот код состояния, потому что веб-сервер (работает на веб-сайте) считает, что поток данных, отправленный клиентом (например, ваш веб-браузер или наш робот CheckUpDown), был «неверным», т.е. не соблюдал протокол HTTP протокол полностью. Таким образом, веб-сервер не смог понять запрос и обработать его

войти выше проблемы в отношении КСН visit this link

+0

Код состояния 400 верен, я хочу получить сообщение о статусе, например «Недопустимые учетные данные пользователя», то, что сервер отвечает в моем веб-приложении с этим URL-адресом – Harry

1

Блок ошибок не вызывается, так как объект ошибка создается только в случае возникновения ошибки на уровне системы. Этого не происходит, потому что запрос отправляется правильно, и сервер отправляет ответ. Если вы контролируете сервер, вы, вероятно, должны вернуть код статуса 200 и включить в него код состояния уровня приложения, который скажет вашему приложению, что введенные учетные данные неверны.

Edit:

Чтобы получить сообщение о состоянии вы можете использовать

+ (NSString *)localizedStringForStatusCode:(NSInteger)statusCode 

Это метод класса класса NSHTTPURLResponse.

if (res.statusCode != 200) 
    { 
//   show the user the status message 
     NSLog(@"Error: %@", [NSHTTPURLResponse localizedStringForStatusCode: res.statusCode]); // This part is called 

    } 
+0

Спасибо, дело в том, в javascript я могу получить ответ statusText в этом точно таком же запросе. Не могу ли я это сделать с помощью obj c? – Harry

+0

Не объяснит ли это, что такое ошибка 400? Его не собираюсь на самом деле дать мне ответный текст. – Harry

+0

Является ли ваш текст ответа частью тела ответа? –

0

Если вы читаете документацию sendSynchronousRequest ...

ошибка Out параметр используется, если возникает ошибка при обработке запроса. Может быть NULL.

это означает, что erro будет действительным объектом NSError в случае возникновения проблемы для разрешения запроса, например, неправильного URL-адреса.

Если запрос может быть разрешен, ошибка будет NULL и согласно протоколу HTTP и в зависимости от сервера, который вы пытаетесь подключить, объект NSHTTPURLResponse будет содержать всю информацию о запросе.

В общем случае ошибка состоит в том, что каждый код состояния, отличный от 200, является ошибкой, например, для API 204 на основе REST означает пустые данные, и в этом случае запрос завершается успешно, но запрошенный ресурс представляет собой только пустые данные , и это не ошибка.

Так что о вашем вопросе, абсолютно нормально, что ошибка NULL в большинстве случаев, если это не значит, что есть проблема перед достижением целевого сервера, в общем, вы должны учитывать как ошибку, так и согласно серверу что вы пытаетесь говорить с картами кодов состояния, в большинстве случаев шаблон REST

Смежные вопросы