Как переопределить определение типа содержимого POST? - PullRequest
1 голос
/ 21 декабря 2011

Я пытаюсь перенести существующее веб-приложение в Lithium framework.

Если я отправляю данные в формате JSON в URL-адрес и устанавливаю заголовок Content-Type равным application/json по запросу, данные POST автоматически анализируются и доступны в контроллере (как $this->request->data). Hooray.

Однако мне нужно поддерживать клиентское приложение, которое неправильно устанавливает заголовок Content-Type. В этом случае инфраструктура предполагает, что это данные формы в кодировке URL, и пытается проанализировать их как таковые.

Есть ли способ переопределить тип содержимого запроса для определенного URL-адреса, если он будет правильно проанализирован?

1 Ответ

1 голос
/ 22 декабря 2011

Попробуйте следующее в вашем скрипте bootstrap.php.Если массив данных запроса содержит только один элемент и этот элемент может быть декодирован, данные запроса заменяются декодированными данными JSON.

use \lithium\action\Dispatcher;

Dispatcher::applyFilter('run', function($self, $params, $chain) {

    // Only check for JSON data for a certain URL
    if($params['request']->url == 'your/url/here') {

        // If the data array only has one element and the key can be decoded as
        // JSON data, replace the request data with the decoded JSON array
        if(count($params['request']->data) == 1) {
            $keys = array_keys($params['request']->data);
            $data = $keys[0];
            if(($data = json_decode($data, true)) != null) {
                $params['request']->data = $data;
            }
        }
    }

    return $chain->next($self, $params, $chain);

});
...