PHP将POST请求转换为GET

时间:2011-05-24 18:30:01

标签: php iphone ipad http-post in-app-purchase

我正在尝试在iPad上创建一个应用内购买商店。作为该系统的一部分,我使用服务器来托管IAP内容,并在给出有效收据时提供适当的资产。我这样做的方法是让iPad向我的服务器发送HTTP POST,帖子的正文是收据数据。

这是我的问题:由于某种原因,服务器将POST请求解释为GET,因此,php://输入始终为空。真正奇怪的是它适用于我的本地开发环境(Windows,Apache,PHP 5.3),但不适用于我的共享托管生产服务器(Linux,Apache,PHP 5.2)。

以下是iPad的相关代码:

NSURL* url = [[NSURL alloc] initWithScheme:@"http" host: host path: path]; 
NSMutableURLRequest* theRequest = [[NSMutableURLRequest alloc] initWithURL: url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval: 60.0f];
[url release];

[theRequest setHTTPMethod: @"POST"];
[theRequest setValue: @"application/x-www-form-urlencoded" forHTTPHeaderField: @"Content-Type"];
NSMutableData* postBody = [[NSMutableData alloc] init];
NSString* receiptString = [self newEncodedString:transaction.transactionReceipt];
[postBody appendData:[receiptString dataUsingEncoding:NSUTF8StringEncoding]];
[receiptString release];
NSString* postLength = [[NSString alloc] initWithFormat: @"%d", [postBody length]];
[theRequest setValue: postLength forHTTPHeaderField: @"Content-Length"];
[postLength release];
[theRequest setHTTPBody: postBody];
[postBody release];

NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:self];
if (theConnection) {
...

这是PHP服务器代码:

$httpRequestBody = '';
$fh = @fopen('php://input', 'r');
if ($fh)
{
    while (!feof($fh)) {
        $s = fread($fh, 1024);
        if (is_string($s)) {
            $httpRequestBody .= $s;
        }
    }
    fclose($fh);
} else {
    $statusCode = 1;
}

$httpRequestBody最终在生产服务器上为空。当我调用phpinfo()时,REQUEST_METHOD是一个GET。非常感谢任何帮助!

3 个答案:

答案 0 :(得分:1)

不应该做循环,只需做

$httpRequestBody = file_get_contents('php://input')

但是,正如你所说的那样,它显示为GET,因此GET请求不会有body来读取,因此此方法永远不会有任何数据可用。只有带有查询参数的URL。

检查您的手机是否实际发送了POST,然后检查您的服务器是否以某种方式将请求重写/重定向到GET中。这应该在服务器的访问日志中很容易看到。

答案 1 :(得分:0)

使用$HTTP_RAW_POST_DATA读取原始POST数据。

答案 2 :(得分:0)

使用$_REQUEST代替$ _GET / $ _ POST这样简单的事情可以做到吗?