Slim、Postman 和 AngularJs:$app->request->getBody() 与 $app->request->post()

Slim, Postman and AngularJs : $app->request->getBody() vs $app->request->post()

我是初学者。我在客户端编写了一个由 AngularJs GUI 和服务器端的 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 应用程序提交一本书时,我可以使用

在 Slim 中捕获 POST
$post_a = json_decode($app->request->getBody());
//$post_b = $app->request->post(); //this would be empty

当我使用 Postman 并执行 POST 时,我可以使用

在 Slim 中捕获 POST
//$post_a = json_decode($app->request->getBody()); // this would be empty
$post_b = $app->request->post();

我不明白为什么会有这种差异。你能解释一下吗?

我不是要用 $app->request->post(); 捕捉 post 吗?在这两种情况下?为什么来自 Angular 的 post 只能通过 $app->request->getBody() 捕获?

$app->request->post() 方法检索在 application/x-www-form-urlencoded 请求中提交的 key/value 数据。如果请求使用不同的内容类型(例如 application/json),您可以使用 $app->request->getBody() 方法检索原始请求主体并根据需要对其进行解码。如果您还有其他问题,请告诉我。

谢谢 Josh..你的回答对我有用。

要遵循的步骤:

1.You 需要在原始选项卡下以 json 格式发送请求,如下所示:

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

2.You需要在headers.

中设置Content-Typeapplication/json

就是这样,它会起作用。

您仍然可以使用

$post_b = $app->request->post()

苗条。

只要您从 html 表单 (AngularJS) 调用此 REST 服务,将数据作为格式化的表单值而不是 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格式的数据