2013-07-29 3 views
0

Обновление: Благодаря Робу, я обнаружил, что сервер также не видит параметры запроса при простом вводе адреса в iOS Safari (однако Mac OS Mac отлично работает). Так что, похоже, это может быть что-то странное на стороне сервера.NSURLConnection не отправляет запрос


У меня возникла странная проблема, когда следующий код не отправляет раздел запроса запроса. Если я зарегистрирую $_SERVER['QUERY_STRING'] на стороне сервера, он пуст. Однако, если я просто набираю url в браузере, сервер правильно регистрирует его.

Также странно NSURL поднимает строку запроса штраф, если я вхожу [nsurl query], так что проблема, как представляется, либо с NSURLConnection или 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 и до сих пор ничего хорошего.

ответ

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.)

+0

«... массив, содержащий информацию **, например ** заголовки ...» Индекс '' QUERY_STRING '' четко документирован. – devios1

+0

Fwiw, '$ _GET' также пуст для ожидаемого параметра запроса. Например. '$ _GET [ "isajax"]'. – devios1

+0

@chaiguy Конечно, вы можете использовать '_SERVER ['QUERY_STRING']', если вы хотите, чтобы все ваши параметры возвращались в одну строку. Я предполагал, что вы искали простой способ получить все параметры запроса по отдельности. Но если вы сами проанализируете это вручную, вы можете использовать '_SERVER ['QUERY_STRING']'. Например, если у меня есть php-страница, которая выполняет ' ', он возвращает строку запроса в порядке. Возможно, вы можете изменить свой вопрос, показывая свой PHP-код. Но выдача запроса, как и у вас, работает нормально (хотя я бы не использовал 'mainQueue'). – Rob

0

Оказалось, as according to this answer, проблема была не с NSURLConnection, либо с телефоном вообще, но с моим использованием mod-rewrite на стороне сервера. Параметры URL не были явно сопоставлены и поэтому каким-то образом не интерпретировались как параметры запроса PHP, хотя, как ни странно, они все еще были частью URL-адреса страницы, что отражено в $_SERVER['REQUEST_URI'] и $_SERVER['HTTP_REFERER'] (но не $_SERVER['QUERY_STRING']). Как Хром обошел это, я понятия не имею.

Мое решение будет состоять в том, чтобы просто проверить REQUEST_URI вместо QUERY_STRING, вместо того, чтобы беспокоиться о модификации мод, что является серьезной болью. ;)

Смежные вопросы