2012-04-11 3 views
4

Я делаю проект на iPhone. Здесь я должен отправить запрос POST в веб-службу. Я использую NSMutableURLRequest и NSURLConnection для отправки данных, а сервер использует PHP. Я обнаружил, что проверка if ($_SERVER['REQUEST_METHOD'] != "POST") всегда терпит неудачу, так же как и в возвратах «GET», даже когда я запускаю ее на локальном хосте.

запроса Моего POST выглядит следующим образом (понюхал через Wireshark):

POST tester.php HTTP/1.1 
Host: localhost 
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:10.0.2) Gecko/20100101 Firefox/10.0.2 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Language: en-us,en;q=0.5 
Accept-Encoding: gzip, deflate 
Connection: keep-alive 
Referer: http://localhost/tester.php 
Content-Type: application/x-www-form-urlencoded 
Content-Length: 422 

protocol=4&msgtype=authorize&merchant=86189919&language=da&ordernumber=1274168351&amount=100&currency=DKK&continueurl=http%3A%2F%2Fquickpay.net%2Ffeatures%2Fpayment-window%2Fok.php&cancelurl=http%3A%2F%2Fquickpay.net%2Ffeatures%2Fpayment-window%2Ferror.php&callbackurl=http%3A%2F%2Fquickpay.net%2Ffeatures%2Fpayment-window%2Fcallback.php&autocapture=0&cardtypelock=&splitpayment=1&md5check=d2259d9db077e0f5a41b4bf271c3c549 

Конечно, есть много манекена текст там, что, как правило, не быть там с iPhone, но я пытался сделать тот же вызов через html-форму, и это сработало. Поэтому я скопировал всю информацию, чтобы узнать, не изменит ли это, но безрезультатно.

Я сравнил два запроса (один из iPhone, другой с моей страницы php), и они выглядят точно так же.

Я влюблен - у кого-нибудь есть хороший совет, что делать?

Edit:

Ваш тест не испытывать на пост или пост против ГЭТ, это тестирование на POST конкретно, вы могли бы иметь проблему дела там ... Вы пробовали проверки запрос себя в php? - Grady Player

Да, это может быть правдой, но линия всегда возвращает GET, поэтому проблема с корпусом покрыта, если это то, что вы имеете в виду.

Кроме того, пожалуйста, напишите результат print_r ($ _ SERVER) с сервера, когда iPhone отправляет запрос - Aleks G

Array (HTTP_HOST => 10.11.105.254 HTTP_USER_AGENT => Mozilla/5.0 (iPhone Simulator, процессор iPhone OS 5_1, как Mac OS X) AppleWebKit/534.46 (KHTML, например Gecko) Mobile/9B176 HTTP_ACCEPT => text/html, application/xhtml + xml, application/xml; q = 0.9, /; q = 0.8 HTTP_ACCEPT_LANGUAGE => ru-us HTTP_ACCEPT_ENCODING => gzip, deflate HTTP_CONNECTION => keep-alive PATH =>/usr/bin:/bin:/usr/sbin:/sbin SERVER_SIGNATURE => Apache/2.2.21 (Unix) DAV/2 PHP/5.3.8 с сервером Suhosin-Patch a t 10.11.105.254 Порт 80 SERVER_SOFTWARE => Apache/2.2.21 (Unix) DAV/2 PHP/5.3.8 с Suhosin-Patch SERVER_NAME => 10.11.105.254 SERVER_ADDR => 10.11.105.254 SERVER_PORT => 80 REMOTE_ADDR => 10.11 .105.254 DOCUMENT_ROOT =>/Библиотека/WebServer/Documents SERVER_ADMIN => [email protected] SCRIPT_FILENAME => /Users/tester.php REMOTE_PORT => 51492 GATEWAY_INTERFACE => CGI/1.1 SERVER_PROTOCOL => HTTP/1.1 REQUEST_METHOD => GET QUERY_STRING = > REQUEST_URI => /tester.php SCRIPT_NAME => /tester.php PHP_SELF => /tester.php request_time => 1334211212 ARGV => Массив ARGC => 0)

ли вы пытаетесь проверить, чтобы увидеть, если известно переменная, например $ _POST ['known_to_be_set_by_client'] установлен или нет? Это не PHP, который определяет, является ли запрос POST или GET, это веб-сервер. - Tim Post

Когда я пытаюсь повторить известную переменную из запроса iPhone, она, конечно, пуста. Это имеет смысл. Когда я повторяю одно и то же из формы, он есть.

Опубликовать код iOS для вашего использования, чтобы сделать реальный запрос.- Клифф Ribaudo

Вот код, который создает запрос и отправляет его:

//variables 
NSString *protocol = @"4"; 
NSString *msgtype = @"authorize"; 
NSString *merchant = @"86189919"; 
NSString *language = @"da"; 
NSString *orderNo = @"1274168351"; 
NSString *amount = @"100"; 
NSString *currency = @"DKK"; 
NSString *continueURL = @"http://quickpay.net/features/payment-window/ok.php"; 
NSString *cancelURL = @"http://quickpay.net/features/payment-window/error.php"; 
NSString *callbackURL = @"http://quickpay.net/features/payment-window/callback.php"; 
NSString *autoCapture = @"0"; 
NSString *cardtypeLock [email protected]""; 
NSString *splitText = @"1"; 
NSString *md5check = @"d2259d9db077e0f5a41b4bf271c3c549"; 

//setting up the request 
NSMutableString *post = [[NSMutableString alloc] initWithString:@"protocol="]; 
[post appendString:protocol]; 

[post appendString:@"&msgtype="]; 
[post appendString:msgtype]; 

[post appendString:@"&merchant="]; 
[post appendString:merchant]; 

[post appendString:@"&language="]; 
[post appendString:language]; 

[post appendString:@"&ordernumber="]; 
[post appendString:orderNo]; 

[post appendString:@"&amount="]; 
[post appendString:amount]; 

[post appendString:@"&currency="]; 
[post appendString:currency]; 

[post appendString:@"&continueurl="]; 
[post appendString:continueURL]; 

[post appendString:@"&cancelurl="]; 
[post appendString:cancelURL]; 

[post appendString:@"&callbackurl="]; 
[post appendString:callbackURL]; 

[post appendString:@"&autocapture="]; 
[post appendString:autoCapture]; 

[post appendString:@"&cardtypelock="]; 
[post appendString:cardtypeLock]; 

[post appendString:@"&splitpayment="]; 
[post appendString:splitText]; 

[post appendString:@"&md5check="]; 
[post appendString:md5check]; 


//escape characters 
NSString *tmp = (__bridge NSString *)CFURLCreateStringByAddingPercentEscapes(
             NULL, 
             (__bridge CFStringRef)post, 
             NULL, 
             (CFStringRef)@";/:@+$,~", 
             kCFStringEncodingUTF8 
             ); 


NSData *body = [tmp dataUsingEncoding:NSUTF8StringEncoding]; 
//setup url 
NSString *urlString [email protected]"http://10.10.225.255/tester.php"; 
NSURL *quickUrl = [NSURL URLWithString:urlString]; 

//setup URL request 
NSMutableURLRequest *request = [[NSMutableURLRequest alloc]init]; 
//method 
[request setHTTPMethod:@"POST"]; 
//url 
[request setURL:url]; 

//body data to string 
NSString *strData = [[NSString alloc]initWithData:body encoding:NSUTF8StringEncoding]; 

//content length 
NSString *postLenght = [NSString stringWithFormat:@"%d", [body length]]; 

//set body 
[request setHTTPBody:body]; 

//Dummy data to make the request look like the same from the HTML form. 
[request setValue:@"localhost" forHTTPHeaderField:@"Host"]; 
[request setValue:@"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:10.0.2) Gecko/20100101 Firefox/10.0.2" forHTTPHeaderField:@"User-Agent"]; 
[request setValue:@"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" forHTTPHeaderField:@"Accept"]; 
[request setValue:@"en-us,en;q=0.5" forHTTPHeaderField:@"Accept-Language"]; 
[request setValue:@"gzip, deflate" forHTTPHeaderField:@"Accept-Encoding"]; 
[request setValue:@"http://localhost/tester.php" forHTTPHeaderField:@"Referer"]; 
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"content-type"]; 
[request setValue:postLenght forHTTPHeaderField:@"content-length"]; 

//send the request to server 
if([[NSURLConnection alloc] initWithRequest:request delegate:self]){ 
    NSLog(@"sending data to quickpay"); 
} 
+2

Ваш тест не тестируется на пост или пост, а не на получение, он специально тестирует POST, у вас может быть проблема с случаем ... Вы пытались проверить сам запрос в php? –

+1

Опубликуйте код iOS, который используется для получения фактического запроса. –

+0

Также, пожалуйста, опубликуйте результат 'print_r ($ _ SERVER)' с сервера, когда iPhone отправит запрос. –

ответ

0

Я понял. Как и ожидалось, это был контроль над собой! Когда я загружался в url в UIWebView, в делегате я использовал метод loadRequest, который, конечно же, использует запрос GET для возврата содержимого. Вместо этого я должен был использовать loadHTMLString: baseURL: вместо этого вместо загрузки возвращаемых данных. Эта ошибка означала, что приложение выпустило другой запрос GET после моего первоначального POST, который вызвал ошибку. Очевидно, я не заметил этого дополнительного запроса в течение долгого времени.

1

(Это больше комментарий, чем ответ) Если

if ($_SERVER['REQUEST_METHOD'] != "POST") 

всегда терпит неудачу (как вы пишете в своем вопросе), это должно означать что:

$_SERVER['REQUEST_METHOD'] == "POST" 

Таким образом, либо вы задали неправильный вопрос, либо неправильно проверяете входные значения. Пожалуйста, добавьте вывод var_dump($_SERVER) на ваш вопрос.

+0

Ого ... глупо мне, - спросил я НЕПРАВИЛЬНЫЙ вопрос. Конечно, если ($ _SERVER ['REQUEST_METHOD']! = "POST") не терпит неудачу, ему это удастся! Я хочу, чтобы это POST-запрос PHP интерпретировал его как GET. – MsJorge

+0

Проводной. '$ _SERVER ['REQUEST_METHOD'] ==" GET "' в соответствии с вашими изменениями. Было бы интересно увидеть код, который вызывает запрос. Если это действительно запрос POST, вы, вероятно, обнаружили ошибку. Давайте узнаем позже. – hakre

+0

ОК. Позвольте мне просто упорядочить код из iOS, чтобы он был доступен для других людей, и я опубликую его. – MsJorge

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