Я делаю проект на 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¤cy=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:@"¤cy="];
[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");
}
Ваш тест не тестируется на пост или пост, а не на получение, он специально тестирует POST, у вас может быть проблема с случаем ... Вы пытались проверить сам запрос в php? –
Опубликуйте код iOS, который используется для получения фактического запроса. –
Также, пожалуйста, опубликуйте результат 'print_r ($ _ SERVER)' с сервера, когда iPhone отправит запрос. –