简体   繁体   English

在PHP中,iPhone POST请求始终被$ _SERVER ['REQUEST_METHOD']视为GET

[英]iPhone POST request is always seen as GET by $_SERVER['REQUEST_METHOD'] in PHP

I'm doing a project on an iPhone. 我正在iPhone上做一个项目。 Here I have to send a POST request to a web service. 在这里,我必须向Web服务发送POST请求。 I use a NSMutableURLRequest and a NSURLConnection to send the data, and the server uses PHP. 我使用NSMutableURLRequest和NSURLConnection发送数据,服务器使用PHP。 I have found that the check if ($_SERVER['REQUEST_METHOD'] != "POST") always fails, as in returns 'GET', even when I try it on localhost. 我发现检查if ($_SERVER['REQUEST_METHOD'] != "POST")总是失败,就像返回'GET'一样,即使我在localhost上尝试它也是如此。

My POST request looks as follows (sniffed via Wireshark): 我的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

Of course there is a lot dummy text in there, that would normally not be there from a iPhone, but I have tried to make the same call via a html form, and that worked. 当然,那里有很多虚拟文本,通常不会出现在iPhone上,但是我试图通过html表单进行相同的调用,这很有效。 Therefore I have copied all the information over to see if that would make a difference, but to no avail. 因此,我已经复制了所有信息,看看这是否有所作为,但无济于事。

I have compared the two requests (one from the iPhone, the other from my php page) and they look exactly the same. 我比较了两个请求(一个来自iPhone,另一个来自我的php页面),它们看起来完全一样。

I'm flabbergasted - does anyone have a good advice on what to do? 我大吃一惊 - 有没有人对如何做有很好的建议?

Edit: 编辑:

Your test isn't testing for post or post vs get, it is testing for POST specifically, you could have a case issue there... Have you tried inspecting the request itself in php? 你的测试不测试post或post vs get,它专门测试POST,你可能有一个案例问题......你有没有尝试在php中检查请求本身? – Grady Player - 格雷迪球员

Yes, that could be true, but the line always returns GET, so the case issue is covered, if that's what you mean. 是的,这可能是真的,但该行总是返回GET,因此案例问题已经涵盖,如果这就是你的意思。

Also, please post the result of print_r($_SERVER) from the server when the iPhone sends the request – Aleks G 另外,当iPhone发送请求时,请从服务器发布print_r($ _ SERVER)的结果 - Aleks G.

Array( HTTP_HOST => 10.11.105.254 HTTP_USER_AGENT => Mozilla/5.0 (iPhone Simulator; CPU iPhone OS 5_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like 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 with Suhosin-Patch Server at 10.11.105.254 Port 80 SERVER_SOFTWARE => Apache/2.2.21 (Unix) DAV/2 PHP/5.3.8 with 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 => GET QUERY_STRING => REQUEST_URI => /tester.php SCRIPT_NAME => /tester.php PHP_SELF => /tester.php REQUEST_TIME => 133 数组(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)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 with Suhosin-Patch Server at 10.11.105.254 Port 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 => / 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 => GET QUERY_STRING => REQUEST_URI => /tester.php SCRIPT_NAME => /tester.php PHP_SELF => /tester.php REQUEST_TIME => 133 4211212 argv => Array argc => 0 ) 4211212 argv =>数组argc => 0)

Did you try checking to see if a known variable, eg $_POST['known_to_be_set_by_client'] is set or not? 您是否尝试检查是否设置了已知变量,例如$ _POST ['known_to_be_set_by_client']? It's not PHP that figures out if a request is POST or GET, it's the web server. 如果请求是POST或GET,那不是PHP,它是Web服务器。 – Tim Post - 蒂姆波斯特

When I try to echo a known variable from the iPhone request, it is of course empty. 当我尝试从iPhone请求中回显已知变量时,它当然是空的。 Which makes sense. 这是有道理的。 When I echo the same thing from the form it is there. 当我从表格中回应同样的东西时就在那里。

Post the iOS code your using to make the actual request. 发布您使用的iOS代码以发出实际请求。 – Cliff Ribaudo - Cliff Ribaudo

Here is the code that creates the request and sends it: 以下是创建请求并发送请求的代码:

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

(This is more a comment than an answer) If (这更像是评论而不是答案)如果

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

always fails (as you write in your question), this must mean that: 总是失败(正如你在你的问题中写的那样),这必须意味着

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

So either you have asked the wrong question, or you are not properly validating input values. 所以要么你提出了错误的问题,要么你没有正确验证输入值。 Please add the output of var_dump($_SERVER) to your question. 请将var_dump($_SERVER)的输出添加到您的问题中。

I figured it out. 我想到了。 As expected, it was an oversight by myself! 正如所料,这是我自己的疏忽! When I loaded to url into the UIWebView, in the delegate, I used the loadRequest method, which of course uses a GET request to return the content. 当我将url加载到UIWebView中时,在委托中,我使用了loadRequest方法,该方法当然使用GET请求来返回内容。 Instead I should have used the loadHTMLString:baseURL: method instead to load the returned data. 相反,我应该使用loadHTMLString:baseURL:方法来加载返回的数据。 This error meant that the app issued another GET request after my initial POST, which caused the error. 此错误意味着应用程序在我的初始POST后发出了另一个GET请求,从而导致错误。 Obviously I didn't notice this extra request for a looong time. 显然我没有注意到这个额外的时间要求。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM