2012-04-11 114 views
4

我正在iPhone上做项目。在这里,我必须发送一个POST请求到一个Web服务。我使用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页面),他们看起来一模一样。

我大吃一惊 - 有没有人有什么好的建议?

编辑:

您的测试没有为邮寄或交VS GET测试,是测试POST具体来说,你可以有一个情况下,问题出现......您是否尝试过检查的要求本身在PHP? - Grady Player

是的,这可能是真的,但行总是返回GET,所以案例问题被覆盖,如果这就是你的意思。

另外,请不要的print_r的结果($ _ SERVER)从当iPhone发送请求的服务器 - 阿莱克斯ģ

阵列(HTTP_HOST => 10.11.105.254 HTTP_USER_AGENT =>的Mozilla/5.0 (iPhone模拟器; CPU iPhone OS 5_1,例如Mac OS X)为AppleWebKit/534.46(KHTML,例如Gecko)移动/ 9B176 HTTP_ACCEPT => text/html的,应用/ XHTML + xml的,应用/ XML; q = 0.9,/; q = 0.8 HTTP_ACCEPT_LANGUAGE => zh_CN 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 Server a吨10.11.105.254端口80 SERVER_SOFTWARE =>的Apache/2.2.21(UNIX)DAV/2 PHP/5.3.8用了Suhosin贴片SERVER_NAME => 10.11.105.254 SERVER_ADDR => 10.11.105.254 SERVER_PORT => 80 REMOTE_ADDR => 10.11 .105.254 DOCUMENT_ROOT => /库/ Web服务器/文件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']是否设置?如果请求是POST或GET,它不是PHP,它是Web服务器。 - 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

您的测试是不是测试后发布或发布VS获取,它是专门测试POST,你可能有一个案件的问题那里...你有没有尝试检查请求本身在PHP? – 2012-04-11 14:00:44

+1

发布您用于制作实际请求的iOS代码。 – 2012-04-11 14:01:22

+0

另外,当iPhone发送请求时,请从服务器发布'print_r($ _ SERVER)'的结果 – 2012-04-11 14:02:28

回答

0

我想通了。如预期的那样,这是我自己的疏忽! 当我将url加载到UIWebView中时,在委托中,我使用了loadRequest方法,这当然使用GET请求来返回内容。相反,我应该使用loadHTMLString:baseURL:方法来加载返回的数据。 这个错误意味着应用程序在我的初始POST后发出了另一个GET请求,这导致了错误。很明显,我没有注意到这个额外的要求一个looong时间。

1

(这是一个多回答评论)如果

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

总是失败(如你写在你的问题中),这个必须意思是即:

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

所以要么你问错了问题,要么你没有正确验证输入值。请将var_dump($_SERVER)的输出添加到您的问题中。

+0

哦......我愚蠢 - 我问了错误的问题。当然,如果($ _SERVER ['REQUEST_METHOD']!=“POST”)不失败,它会成功! 我希望它成为PHP的POST请求,将其解释为GET。 – MsJorge 2012-04-12 06:01:38

+0

有线。 '$ _SERVER ['REQUEST_METHOD'] ==“GET”'根据您的编辑。看到激发请求的代码会很有趣。如果它确实是一个POST请求,你可能已经发现了一些错误。让我们稍后再看看。 – hakre 2012-04-12 08:44:44

+0

好的。让我只安排来自iOS的代码,以便其他人可读,我将发布它。 – MsJorge 2012-04-12 11:41:49