Slim, Postman и AngularJs: $app-›request-›getBody() vs $app-›request-›post()

Я новичок. Я написал тестовое приложение, состоящее из графического интерфейса AngularJs на стороне клиента и PHP API на стороне сервера.

Это служба angular, обрабатывающая запросы

myApp.factory('Book', ['$resource', 'API_URL', function($resource, API_URL){

    return $resource(API_URL + '/books/:bookId', {bookId: '@bookId'}, {
        get: { method: 'GET', isArray:true },
        update: { method: 'PUT'},
        save: { method: 'POST'},
        delete: {method:'DELETE'},
    });

}]);

Когда я отправляю книгу из приложения Angular, я могу поймать POST в Slim, используя

$post_a = json_decode($app->request->getBody());
//$post_b = $app->request->post(); //this would be empty

Когда я использую Postman и выполняю POST, я могу поймать POST в Slim, используя

//$post_a = json_decode($app->request->getBody()); // this would be empty
$post_b = $app->request->post();

Я не понимаю, почему такая разница. Не могли бы вы объяснить?

Разве я не собирался перехватывать сообщение только с помощью $app->request->post(); в обоих случаях? Почему пост из Angular можно перехватить только с помощью $app->request->getBody()?


person wwr    schedule 09.01.2015    source источник


Ответы (3)


Метод $app->request->post() извлекает данные типа ключ/значение, представленные в запросе application/x-www-form-urlencoded. Если в запросе используется другой тип содержимого (например, application/json), вы можете получить необработанное тело запроса с помощью метода $app->request->getBody() и при необходимости декодировать его. Дайте мне знать, если у вас есть дополнительные вопросы.

person Josh Lockhart    schedule 09.01.2015
comment
Ха! Я вижу, спасибо! Моя цель также заключалась в том, чтобы понять, как протестировать конечную точку с помощью Postman, и теперь я вижу, что мне нужно установить для заголовка Content-Type значение application/json, тогда тело должно быть необработанным и должно содержать json, например {title:new title} и все работает. - person wwr; 09.01.2015

Вы все еще можете использовать

$post_b = $приложение->запрос->сообщение()

в Слим.

Пока вы вызываете эту службу REST из html-формы (AngularJS), передавая данные в виде форматированного значения формы, а не в формате JSON. Если в AngularJS у вас есть данные в формате JSON, вы должны сначала перевести их в форму. Ниже приведен пример вызова этой службы REST:

Object.toparams = function ObjecttoParams(obj) {
    var p = [];
    for (var key in obj) {
        p.push(key + '=' + encodeURIComponent(obj[key]));
    }
    return p.join('&');
};

$http({
    method: 'POST',
    url: url,
    data: Object.toparams(myobject),
    headers: {'Content-Type': 'application/x-www-form-urlencoded'}
})

myobject — это данные в формате JSON, которые будут созданы

person Kerisnarendra    schedule 01.09.2016

Спасибо, Джош. Ваши ответы мне помогли.

Шаги, которые необходимо выполнить:

1. Вам нужно отправить запрос в формате json на вкладке raw следующим образом:

{"username":"admin","password":"admin"}

2. Вам нужно установить Content-Type в application/json в заголовках.

Вот так и будет работать.

person Md. Shamsad ahmed    schedule 06.10.2015