La request de POST de iPhone siempre se ve como GET por $ _SERVER en PHP

Estoy haciendo un proyecto en un iPhone. Aquí tengo que enviar una request POST a un service web. Utilizo una NSMutableURLRequest y una NSURLConnection para enviar los datos, y el server usa PHP. He encontrado que la comprobación if ($_SERVER['REQUEST_METHOD'] != "POST") siempre falla, como en devoluciones 'GET', incluso cuando lo bash en localhost.

Mi request de POST se ve de la siguiente manera (inhalada a través de 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 

Por supuesto, hay un montón de text ficticio allí, que normalmente no estaría allí desde un iPhone, pero he intentado hacer la misma llamada a través de un formulario html, y eso funcionó. Por lo tanto, he copydo toda la información para ver si eso marcaría la diferencia, pero fue en vano.

He comparado las dos requestes (una del iPhone, la otra de mi página php) y se ven exactamente igual.

Estoy pasmado: ¿alguien tiene un buen consejo sobre qué hacer?

Editar:

Su testing no está probando para publicar o publicar vs get, está probando específicamente para POST, podría tener un problema de caso allí … ¿Ha intentado inspeccionar la request en sí mismo en php? – Grady Player

Sí, eso podría ser cierto, pero la línea siempre devuelve GET, por lo que el problema del caso está cubierto, si eso es lo que quieres decir.

Además, publique el resultado de print_r ($ _ SERVER) desde el server cuando el iPhone envía la request – Aleks G

Array (HTTP_HOST => 10.11.105.254 HTTP_USER_AGENT => Mozilla / 5.0 (iPhone Simulator; CPU iPhone OS 5_1 como Mac OS X) AppleWebKit / 534.46 (KHTML, como Gecko) Mobile / 9B176 HTTP_ACCEPT => text / html, application / xhtml + xml, application / xml; q = 0.9, / ; q = 0.8 HTTP_ACCEPT_LANGUAGE => en-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 con Suhosin-Patch Server en 10.11.105.254 Puerto 80 SERVER_SOFTWARE => Apache / 2.2.21 (Unix) DAV / 2 PHP / 5.3.8 con 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 => / Library / WebServer / Documents SERVER_ADMIN => you@example.com SCRIPT_FILENAME => / Users / tester .php REMOTE_PORT => 51492 GATEWAY_INTERFACE => CGI / 1.1 SERVER_PROTOCOL => HTTP / 1.1 REQUEST_METHOD => OBTENER QUERY_STRING => REQUEST_URI => /tester.php SCRIPT_NAME => /tester.php PHP_SELF => /tester.php REQUEST_TIME => 133 4211212 argv => Argato argc => 0)

¿Intentó comprobar para ver si una variable conocida, por ejemplo, $ _POST ['known_to_be_set_by_client'] está configurada o no? No es PHP el que calcula si una request es POST o GET, es el server web. – Tim Post

Cuando bash repetir una variable conocida de la request del iPhone, por supuesto, está vacía. Lo cual tiene sentido. Cuando repito lo mismo desde la forma en que está ahí.

Publica el código de iOS que utilizas para hacer la request real. – Cliff Ribaudo

Aquí está el código que crea la request y la envía:

 //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 =@""; 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 =@"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"); } 

(Esto es más un comentario que una respuesta) If

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

siempre falla (como escribes en tu pregunta), esto debe significar que:

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

Entonces, ha hecho la pregunta incorrecta o no está validando correctamente los valores de input. Agregue la salida de var_dump($_SERVER) a su pregunta.

Me lo imaginé. Como era de esperar, ¡fue un descuido por mí mismo! Cuando cargé para url en UIWebView, en el delegado, utilicé el método loadRequest, que por supuesto utiliza una request GET para devolver el contenido. En su lugar, debería haber usado el método loadHTMLString: baseURL: para cargar los datos devueltos. Este error significó que la aplicación emitió otra request GET después de mi POST inicial, lo que provocó el error. Obviamente, no noté esta request extra por mucho time.