0

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


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

如果我登录,也会奇怪地NSURL拿起查询字符串[nsurl query],所以问题似乎与NSURLConnectionor NSURLRequest

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还是不行。

4

2 回答 2

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中。)

于 2013-07-29T20:23:27.793 回答
0

事实证明,根据这个答案,问题根本不NSURLConnection在于手机,而在于我在服务器端使用了 mod-rewrite。url 参数没有被显式匹配,因此在某种程度上没有被 PHP 解释为查询参数,尽管奇怪的是,它们仍然是页面看到的 url 的一部分,由$_SERVER['REQUEST_URI']and $_SERVER['HTTP_REFERER'](但不是$_SERVER['QUERY_STRING'])反映。我不知道 Chrome 是如何解决这个问题的。

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

于 2013-07-29T23:41:37.333 回答