我正在尝试在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。非常感谢任何帮助!
答案 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这样简单的事情可以做到吗?