【问题标题】:NSURLConnection not sending querystringNSURLConnection 不发送查询字符串
【发布时间】:2013-07-29 19:28:33
【问题描述】:

更新:感谢 Rob,我发现在 iOS Safari 中简单地输入地址时,服务器也看不到查询字符串参数(但是,Chrome Mac OS 可以正常工作)。所以看起来它毕竟在服务器端可能有些奇怪。


我遇到了一个奇怪的问题,即以下代码未发送请求的查询字符串部分。如果我在服务器端记录$_SERVER['QUERY_STRING'],它是空白的。但是,如果我只是在浏览器中输入 url,服务器会正​​确记录它。

如果我登录[nsurl query],也奇怪的是NSURL 可以很好地提取查询字符串,所以问题似乎出在NSURLConnectionNSURLRequest

NSString* queryString = [self.appDelegate.connections componentsJoinedByString:@"|"];
NSString* url = [NSString stringWithFormat:@"http://mysite.com/?%@&isajax=1", queryString];
NSLog(@"url: %@", url); // http://mysite.com/?test&isajax=1

NSURL* nsurl = [NSURL URLWithString:url];
NSLog(@"nsurl: %@", [nsurl query]); // test&isajax=1

NSURLRequest *request = [NSURLRequest requestWithURL:nsurl];
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^( NSURLResponse* response, NSData* responseData, NSError* error ) {
    // returns the page as if no query string were present at all
}];

我想知道这是否与缺少文件名有关。也许NSURLConnection 不喜欢那样。 编辑:不,与此无关。试过/index.php?test&isajax=1还是不行。

【问题讨论】:

    标签: php cocoa-touch mod-rewrite query-string nsurlconnection


    【解决方案1】:

    如果你想要请求参数,你应该访问$_REQUEST,而不是$_SERVER。或者,如果是帖子查询,您可以使用$_POST。但是according to the documentation,$_SERVER返回服务器头:

    $_SERVER 是一个包含标题、路径和脚本位置等信息的数组。

    $_REQUEST 返回一个

    一个关联数组,默认包含 $_GET、$_POST 和 $_COOKIE 的内容。

    因此,如果您的请求是:

    http://mysite.com/?test=abc&isajax=1
    

    然后$_REQUEST['test'] 将返回abc$_REQUEST['isajax'] 将返回1


    如果你真的想要未解析的查询字符串,你当然可以使用$_SERVER。因此考虑以下 PHP 代码:

    <?php
    
    echo $_SERVER('QUERY_STRING');
    
    ?>
    

    以及以下 Objective-C 代码(检查 NSURLConnection 相关错误):

    NSURL *url = [NSURL URLWithString:@"http://myurl.com/?test=abc&isajax=1"];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    [NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
        if (error)
        {
            NSLog(@"%s: sendAsynchronousRequest error: %@", __FUNCTION__, error);
            return;
        }
        NSString *string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
        NSLog(@"result string: %@", string);
    }];
    

    按预期返回:

    result string: test=abc&isajax=1
    

    如果你没有得到任何东西,你可能想在 php 中打开错误日志,这样你就可以查看你是否也得到了任何 php 错误。 (比如在你的php.ini中临时设置display_errors = On。)

    【讨论】:

    • "...一个包含信息例如标头的数组..." 'QUERY_STRING' 索引已明确记录。
    • Fwiw,$_GET 对于预期的查询参数也是空白的。例如。 $_GET["isajax"].
    • @chaiguy 当然,如果您希望在单个字符串中返回所有参数,您也可以使用_SERVER['QUERY_STRING']。我假设您正在寻找一种简单的方法来单独获取所有查询参数。但如果您要自己手动解析,可以使用_SERVER['QUERY_STRING']。例如,如果我有一个执行&lt;?php echo $_SERVER['QUERY_STRING']; ?&gt; 的php 页面,它会很好地返回查询字符串。也许您可以修改您的问题以显示您的 PHP 代码。但是像你一样发出请求,工作正常(虽然我不会使用mainQueue)。
    • @chaiguy 你确定你没有得到一些 php 错误(在生产设置中会阻止你看到任何响应)?请参阅带有代码示例的修改后的答案,但是,与此评论相关,建议您确保 display_errors 已打开。
    • 最终弄明白了(见我的回答)。毕竟这确实是一个服务器端问题。为帮助干杯。
    【解决方案2】:

    原来,as according to this answer,问题根本不在于NSURLConnection 或手机,而在于我在服务器端使用了 mod-rewrite。 url 参数没有被显式匹配,因此在某种程度上没有被 PHP 解释为查询参数,尽管奇怪的是它们仍然是页面看到的 url 的一部分,正如 $_SERVER['REQUEST_URI']$_SERVER['HTTP_REFERER'] 所反映的那样(但不是 @ 987654325@)。我不知道 Chrome 是如何解决这个问题的。

    我的解决方案是只检查REQUEST_URI 而不是QUERY_STRING,而不是担心mod-rewrite,这是一个严重的痛苦。 ;)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-12
      • 2014-06-29
      • 2016-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多