1

Тема: Чи можливо прочитати тіло GET-запиту в PHP?

Ну власне subj.
file_get_contents('php://input') для GET-запиту не працює, на відміну від POST та PUT.
Може це в принципі неможливо? Але все ж, у GET-запиті можна передавати тіло, значить мала б бути і можливість це тіло прочитати на стороні сервера.

2

Re: Чи можливо прочитати тіло GET-запиту в PHP?

Можливо. GET-параметри знаходяться у

$_SERVER['QUERY_STRING'];

3

Re: Чи можливо прочитати тіло GET-запиту в PHP?

Скоріш за все у вас невірний підхід якщо ви у get запиті хочете відправити body

4

Re: Чи можливо прочитати тіло GET-запиту в PHP?

http://php.net/manual/ru/function.http- … t-body.php

5

Re: Чи можливо прочитати тіло GET-запиту в PHP?

е,

file_get_contents('php://input')

це взагалі про що? при чому тут гет чи пост?

Подякували: koala1

6

Re: Чи можливо прочитати тіло GET-запиту в PHP?

Автор мабуть пише щось дуже нестандартне.

7 Востаннє редагувалося VTrim (09.01.2015 17:20:20)

Re: Чи можливо прочитати тіло GET-запиту в PHP?

Vo_Vik написав:

е,

file_get_contents('php://input')

це взагалі про що? при чому тут гет чи пост?

Дозволяє приймати не оброблені POST запити в їх початковому вигляді.
Наприклад 2 POST поля

name=MyName&text=Hello

Аналогами є

$HTTP_RAW_POST_DATA
$GLOBALS['HTTP_RAW_POST_DATA']

8

Re: Чи можливо прочитати тіло GET-запиту в PHP?

http://php.net/manual/en/wrappers.php.php - гм ви про це?
Так в гета там пусте тіло запиту за означенням.
Але навіщо такі збочення? воно має смисл використовувати у випадку якихось консольних операцій, але там немає тоді get і post

9

Re: Чи можливо прочитати тіло GET-запиту в PHP?

Як я люблю Php

10

Re: Чи можливо прочитати тіло GET-запиту в PHP?

Приклад

<?php

echo file_get_contents('php://input');

echo '<form method="POST" action="">
      Nick:
     <input type="text" name="nick">
      Text:
     <input type="text" name="txt">
     <input type="submit" value="SEND">';

11

Re: Чи можливо прочитати тіло GET-запиту в PHP?

Це не підходить, там:
Get the raw request body (e.g. POST or PUT data).

Судячи з усього, така можливість не передбачена.
Автор не пише нестандартне, просто у мене PHP (точніше, YII) виступає в ролі API для фронтенду, який на Ангуларі. Відповдіно, можуть бути GET-, POST-, PUT- і DELETE-запити.
Питання більше теоретичне, бо передати з браузера тіло у GET-запиті можна.  Допустимо, є запит, що повертає анкету з id=3, відповдіно, розглядалась можливість передавати змінні не через урл, а в тілі запиту (як воно робиться стандартно для POST чи PUT).
Повторюся, питання чисто теоретичне. здається, в PHP такого не дозволено.

е,

    file_get_contents('php://input')

це взагалі про що? при чому тут гет чи пост?

Стандарно так в коді беруться дані з тіла запиту, наприклад:

$data = CJSON::decode(file_get_contents('php://input'));
    $username = $data['login'];
    $password = $data['pass'];

12

Re: Чи можливо прочитати тіло GET-запиту в PHP?

Vo_Vik написав:

http://php.net/manual/en/wrappers.php.php - гм ви про це?
Так в гета там пусте тіло запиту за означенням.
Але навіщо такі збочення? воно має смисл використовувати у випадку якихось консольних операцій, але там немає тоді get і post

У випадку CGI, тіло запиту (post, але не get, де тіло пусте) подається на stdin. З іншого боку, PHP зчитує й парсить тіло post-запиту автоматично, а програмі дає доступ до змінних з результатом цього парсингу, тому не впевнений, чи взагалі можливо це тіло зчитати власноруч.

13 Востаннє редагувалося VTrim (10.01.2015 10:06:00)

Re: Чи можливо прочитати тіло GET-запиту в PHP?

Мій варіант стандартного $_POST

<?php

(string)$strpost = file_get_contents('php://input');

(array)$ex = explode('&',$strpost);

(array)$dataPost = array();

foreach ($ex as $value)
{
$val = explode('=',$value);
$dataPost[$val[0]] = $val[1];
}

if($dataPost['auth'])
{
echo 'Login - '. $dataPost['login'];
echo '<br>';
echo 'Password - '. $dataPost['password'];
}

echo '<form method="POST">
      Login:
     <input type="text" name="login">
     Password:
     <input type="text" name="password">
     <input type="submit" name="auth" value="SEND">';

14

Re: Чи можливо прочитати тіло GET-запиту в PHP?

P.Y. написав:

.... З іншого боку, PHP зчитує й парсить тіло post-запиту автоматично, а програмі дає доступ до змінних з результатом цього парсингу, тому не впевнений, чи взагалі можливо це тіло зчитати власноруч.....

Парсинг Нове для мене слово, хоча раніше теж зустрічав, я так розумію запозичене звідси,..

Parsing or syntactic analysis is the process of analysing a string of symbols, either in natural language or in computer languages, conforming to the rules of a formal grammar.
The term parsing comes from Latin pars (orationis), meaning part of speech.

Парсинг або Синтаксичний аналіз - процес аналізу виразу символів, як в природній мові так і в комп'ютерних мовах, відповідно до правил граматики.
Термін Парсинг походить від латинського Парс (orationis), що означає частина мови.

15

Re: Чи можливо прочитати тіло GET-запиту в PHP?

А чим власне $_POST і $_GET не підходять?

16

Re: Чи можливо прочитати тіло GET-запиту в PHP?

Vo_Vik написав:

А чим власне $_POST і $_GET не підходять?

А хіба в $_GET тіло записане? Там здається лише ті параметри, які в УРЛ

17

Re: Чи можливо прочитати тіло GET-запиту в PHP?

Matvik написав:
Vo_Vik написав:

А чим власне $_POST і $_GET не підходять?

А хіба в $_GET тіло записане? Там здається лише ті параметри, які в УРЛ

А хіба ҐЕТ взагалі має тіло?

18 Востаннє редагувалося ktretyak (14.01.2015 15:49:45)

Re: Чи можливо прочитати тіло GET-запиту в PHP?

Matvik, якщо ви працюєте з AngularJS, то даю вам працюючий варіант POST запиту (думаю, що у вас виникли проблеми з відправкою саме POST запиту, а тому ви намагаєтесь працювати з GET).

Не роблю очищення коду, бо думаю ви розбиретесь де потрібна вам частина, плюс - прогляните як я обробляю відповідь від сервера. На HTML-сторінці у формі, вставляєте атрибут  ng-submit="fetch()", який викликає наведену в коді функцію (яка знаходиться в контролері)

var el = document.getElementById.bind(document);

$scope.fetch = function()
{
    angular.element(el('serch_text')).addClass('loading');
    $scope.msg = false;
    $cookies.limit_fetch = $scope.limit_fetch;
    
    var search_text = $scope.search_text;
    search_text = angular.isDefined(search_text) ? search_text : '';

    $scope.conv_lvls_to_arr();
    
    try
    {
        data_post = angular.toJson(
        {
            "date_fr": ($scope.date_fr.getTime()/1000),
            "date_to": ($scope.date_to.getTime()/1000 + (24*3600)),
            "limit_fetch": $scope.limit_fetch,
            "levels": arr_levels,
            "search_text": encodeURIComponent(search_text)
        });
    }
    catch(err)
    {
        angular.element(el('serch_text')).removeClass('loading');
        $scope.msg =
        {
            'class': 'warning',
            html: '<strong>Warning:</strong> ' + err.message
        };
        return;
    }

    $http
    ({
        method: 'POST'
        ,url: ''
        ,data: 'json=' + data_post
        ,cache: false
        ,headers: {"X-Requested-With": "XMLHttpRequest", "Content-Type" : "application/x-www-form-urlencoded; charset=UTF-8"}
    })
    .success(function(data)
    {
        angular.element(el('serch_text')).removeClass('loading');
        try
        {
            data = angular.fromJson(data);
        }
        catch(e)
        {
            $scope.msg =
            {
                'class': 'warning',
                html: '<strong>Warning:</strong> Server response is not JSON.'
            };
            return;
        }
        
        if(data.msg)
            $scope.msg =
            {
                'class': data.msg.class,
                html: data.msg.html
            };
        
        if(angular.isUndefined(data.logs) || data.logs == '')
        {
            $scope.logs = [];
            $scope.stat_lvls = [];
            if(angular.isUndefined(data.msg))
            {
                $scope.msg =
                {
                    'class': 'info',
                    html: '<strong>Info:</strong> not found logs with the specified parameters'
                };
            }
            return;
        }
        else
        {
            $scope.logs = data.logs;
        }

        $scope.stat_lvls = [];
        for(var i = 0; i < $scope.logs.length; i++)
        {
            var level = $scope.logs[i].level;
            if(angular.isDefined($scope.stat_lvls[level]))
                $scope.stat_lvls[level]++;
            else
                $scope.stat_lvls[level] = 1;
        }
        
        /**
         * Невеличкий костиль
         */
        var symbol_percent = search_text.indexOf('%');
        if(symbol_percent != -1)
            $scope.search_text = search_text.substr(0, symbol_percent);
    })
    .error(function(data, status)
    {
        $scope.logs = [];
        angular.element(el('serch_text')).removeClass('loading');
        if(status == 401)
        {
            if(angular.isDefined(data.auth_url))
                window.location = data.auth_url;
            else
                $scope.msg =
                {
                    'class': 'warning',
                    html: '<strong>Warning:</strong> Authentication required.'
                };
        }
        else if(status === 500)
            $scope.msg =
            {
                'class': 'warning',
                html: '<strong>Warning:</strong> Request failed.'
            };
    });
}

19 Востаннє редагувалося Vo_Vik (14.01.2015 17:07:20)

Re: Чи можливо прочитати тіло GET-запиту в PHP?

http://stackoverflow.com/questions/9780 … quest-body - почитайте найрейтинговішу відповідь.

Yes, you can send a request body with GET but it should not have any meaning. If you give it meaning by parsing it on the server and changing your response based on its contents you're violating the HTTP/1.1 spec.

цим ви порушуєте специфікацію HTTP/1.1

20

Re: Чи можливо прочитати тіло GET-запиту в PHP?

Як я і писав вище, думаю ця ідея з тілом GET виникла через незвичність роботи AngularJS в порівнянні з jQuery. Я із цим сам грався свого часу.

Справа в тому, що в ангуларі не достатньо зазначити в заголовку

method: 'POST'

, бо браузер серверу хоч і скаже, що це POST-запит, але все одно відсилатиме не post data, як очікується, а якийсь маловідомий request payload.

Щоб браузер відправляв саме post data, то в заголовку необхідно дописувати

headers: {"X-Requested-With": "XMLHttpRequest", "Content-Type" : "application/x-www-form-urlencoded; charset=UTF-8"}