NSURLConnection不发送查询字符串

时间:2013-07-29 19:28:33

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

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


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

同样奇怪的是,如果我记录NSURL[nsurl query]会很好地选择查询字符串,因此问题似乎与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但仍然没有好处。

2 个答案:

答案 0 :(得分: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。)

答案 1 :(得分:0)

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

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