【问题标题】:NSUrlConnection, http-post and sessionNSUrlConnection、http-post 和会话
【发布时间】:2013-12-04 21:05:29
【问题描述】:

我有一个关于 NSUrlConnection 和 http 会话的问题。 我需要使用 POST 调用 httpS url。 我试过这段代码:

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 页面:

您的会话已超时。 Web 应用程序存储有关信息 你在服务器上做什么。该信息称为 会话。

Web 服务器必须跟踪很多很多的会话。如果您不活动一段时间 足够长的时间(通常是几分钟),此信息是 为活跃用户腾出空间。

此时您可以重新启动会话以继续。

编辑

服务器响应:

<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"; } }

如何避免这个问题?我需要什么?

【问题讨论】:

    标签: ios objective-c https http-post nsurlconnection


    【解决方案1】:

    您还可以通过捕获响应来检查服务器在标头中返回的内容:

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

    您可以在此处或connectionDidFinishLoading 中检查响应变量。这应该为您提供有关缺失部分的线索。就目前而言,这可能是服务器问题,尚不清楚客户端应该发送什么。

    顺便说一句,无需启动连接。 init 方法已经启动它。来自文档:

    返回一个初始化的 URL 连接并开始为 URL 请求加载数据。

    【讨论】:

    • 嗨 Mundi,我打印了我的回复: { URL: theHost.com/http://voas.theHost.com:7777/… } { 状态码:200, headers { "Cache-Control" = private;连接=“保持活动”; “内容长度”= 2383; “内容类型”=“文本/html;字符集=UTF-8”;日期 =“格林威治标准时间 2013 年 12 月 4 日星期三 21:21:52”; “保活”=“超时=50,最大=9”;服务器 = "Oracle-Application-Server-10g/9.0.4.3.0 Oracle-HTTP-Server OracleAS-Web-Cache-10g/9.0.4.3.0 (N)"; "Set-Cookie" = "文本 cookie"; } }
    【解决方案2】:

    至少存在三个问题:一个错误、一个可能的改进和一个潜在问题:

    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. 设置body长度时,需要设置长度单位:

      这是你的代码:

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

      这样可以写得更高效:

      NSString* encodedString = ...; // ensure proper encoding!
      NSData* postData = [encodedString dataUsingEncoding:NSUTF8StringEncoding];
      
    3. 您需要确保您的正文根据 Content-Type 正确编码。

      目前,您的数据等于:

      @"selectTipoVeicolo=A&inputTarga=EN784DC"
      

      这个正确编码的。但是手动正确编码很容易出错。我建议为此实现一个辅助方法。见这里:How to send multiple parameterts to PHP server in HTTP post

    【讨论】:

    • 您好 CouchDeveloper,感谢您的建议...我想复制一个网站的 html 形式...有具体的方法吗?
    • 我的问题是:如果我发送一个请求......为什么我会得到一个“会话超时”?
    • 根据您的编辑,您没有超时。 “会话超时”不是 HTTP 协议的一部分,而是一个应用程序。当 HTTP 会话保持空闲超过指定时间段时,应用程序将终止它。然后应用程序将删除与“会话”关联的任何状态。通常,客户端需要重新登录。 HTTP 状态代码可能不同,401、403 或自定义的,未在 RFC 2616 中指定。
    猜你喜欢
    • 2012-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-02
    • 1970-01-01
    • 1970-01-01
    • 2010-12-25
    • 2012-12-27
    相关资源
    最近更新 更多