PHP превращает запрос POST в GET - PullRequest
1 голос
/ 24 мая 2011

Я пытаюсь создать в iPad магазин покупок в приложении.Как часть этой системы, я использую сервер для размещения содержимого IAP и обслуживаю соответствующие активы при получении действительного чека.Я делаю так, чтобы iPad отправлял HTTP-запрос POST на мой сервер, а тело сообщения - это данные чека.

Вот моя проблема: по какой-то причине сервер интерпретирует запрос POST какПОЛУЧИТЕ и по этой причине вход 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 ]

1 голос
/ 24 мая 2011

Не нужно выполнять цикл, просто выполните

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

Но поскольку, как вы говорите, он отображается как GET, этот метод никогда не будет доступен для данных, как запросы GET.не имеют body для чтения.Там только URL с параметрами запроса.

Убедитесь, что ваш телефон на самом деле отправляет POST, а затем проверьте, не перезаписывает ли ваш сервер запрос GET.Все это должно быть легко видно в журнале доступа сервера.

0 голосов
/ 24 мая 2011

Будет ли что-то простое, например, использовать $ _ REQUEST вместо $ _GET / $ _ POST?

0 голосов
/ 24 мая 2011

Используйте $HTTP_RAW_POST_DATA для чтения необработанных данных POST.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...