2013-12-04 3 views
0

У меня вопрос о NSUrlConnection и http session. Мне нужно вызвать URL-адрес httpS, используя POST. Я попробовал этот код:NSUrlConnection, http-post и session

NSString *bodyData = @"selectTipoVeicolo=A&inputTarga=EN784DC"; 
NSMutableURLRequest *postRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"https://www.theUrl.com"]]; 


[postRequest setValue:@"application/x-www-form-urlencoded charset=utf-8" forHTTPHeaderField:@"Content-Type"]; 

    // Designate the request a POST request and specify its body data 
    [postRequest setHTTPMethod:@"POST"]; 
    [postRequest setHTTPBody:[NSData dataWithBytes:[bodyData UTF8String] length:strlen([bodyData UTF8String])]]; 

    NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:postRequest 
                    delegate:self]; 

    [connection start]; 

но я получить HTML-страницу с этим сообщением:

Ваш сеанс истекло. Веб-приложения хранят информацию о , что вы делаете на сервере. Эта информация называется сеансом .

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

На этом этапе вы можете перезапустить сеанс, чтобы продолжить.

EDIT Response

Сервер:

<NSHTTPURLResponse: 0x8ad8400> { URL: theHost.com/http://voas.theHost.com:7777/… } { status code: 200, headers { "Cache-Control" = private; Connection = "Keep-Alive"; "Content-Length" = 2383; "Content-Type" = "text/html;charset=UTF-8"; Date = "Wed, 04 Dec 2013 21:21:52 GMT"; "Keep-Alive" = "timeout=50,max=9"; Server = "Oracle-Application-Server-10g/9.0.4.3.0 Oracle-HTTP-Server OracleAS-Web-Cache-10g/9.0.4.3.0 (N)"; "Set-Cookie" = "text cookie"; } }

Как я могу избежать этой проблемы? Что мне нужно?

ответ

1

Вы можете проверить, что сервер возвращает в заголовке также путем захвата ответа:

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { 
    _data = [[NSMutableData alloc] init]; 
    _response = (NSHTTPURLResponse*) response; 
} 

Вы можете проверить переменный ответ здесь или в connectionDidFinishLoading. Это должно дать вам представление о недостающих частях. В ее нынешнем виде это может быть проблема с сервером, и неясно, что ожидается от клиента.

BTW, нет необходимости запускать соединение. Метод init уже запускает его. Из документов:

Возвращает инициализированное URL-соединение и начинает загружать данные для запроса URL-адреса.

+0

Привет Mundi, я напечатал мой ответ: {URL: https://www.theHost.com/http://voas.theHost.com:7777/ param1, fromParam2.sdirect} {код состояния: 200, заголовки { "Cache-Control" = private; Connection = «Keep-Alive»; "Content-Length" = 2383; "Content-Type" = "text/html; charset = UTF-8"; Дата = "ср, 04 дек. 2013 21:21:52 GMT"; «Keep-Alive» = «timeout = 50, max = 9»; Сервер = "Oracle-Application-Server-10g/9.0.4.3.0 Oracle-HTTP-сервер OracleAS-Web-Cache-10g/9.0.4.3.0 (N)"; "Set-Cookie" = "text cookie"; }} – Safari

0

Есть в наименее три вопроса: одна ошибка, один из возможных усовершенствований и один потенциальный вопрос:

  1. application/x-www-form-urlencoded MIME тип не имеет параметров. (мне интересно, где это происходит из)

    [postRequest setValue:@"application/x-www-form-urlencoded charset=utf-8" 
        forHTTPHeaderField:@"Content-Type"]; 
    

    application/x-www-form-urlencoded MIME тип не имеет параметров вообще, вы не можете указать параметр кодировки. И если параметры должны быть разделены точкой с запятой ;.

    Итак, попробуйте:

    [postRequest setValue:@"application/x-www-form-urlencoded" 
        forHTTPHeaderField:@"Content-Type"]; 
    
  2. При установке длины тела, вам необходимо установить длину в байтах:

    Это ваш код:

    [postRequest setHTTPBody:[NSData dataWithBytes:[bodyData UTF8String] 
            length:strlen([bodyData UTF8String])]]; 
    

    Это может быть более эффективно:

    NSString* encodedString = ...; // ensure proper encoding! 
    NSData* postData = [encodedString dataUsingEncoding:NSUTF8StringEncoding]; 
    
  3. Вам необходимо убедиться, что ваше тело правильно закодировано в соответствии с типом содержимого.

    В настоящее время, ваши данные равны:

    @"selectTipoVeicolo=A&inputTarga=EN784DC" 
    

    Этот является правильно закодирован. Но правильно кодирование вручную - это склонность к ошибкам. Я бы предложил реализовать для этого вспомогательный метод. Смотрите здесь: How to send multiple parameterts to PHP server in HTTP post

+0

Привет, CouchDeveloper, спасибо за ваши предложения ... Я хотел бы воспроизвести html-форму веб-сайта ... Есть ли какой-то конкретный способ сделать это? – Safari

+0

Мой вопрос: если я отправлю один запрос ... почему я получаю «сеанс тайм-аута»? – Safari

+0

По вашему правлению вы не получили тайм-аут. «Тайм-аут сеанса» не является частью протокола HTTP, а является приложением. Приложение HTTP будет прекращено приложением, если оно остается бездействующим за определенный период времени. Затем приложение удалит любое состояние, связанное с «сеансом». Обычно клиенту необходимо снова войти в систему. Коды статуса HTTP могут отличаться, 401, 403 или пользовательские, не указанные в RFC 2616. – CouchDeveloper