如何在 Slim 中访问 POST 请求的 JSON 请求正文?

Posted

技术标签:

【中文标题】如何在 Slim 中访问 POST 请求的 JSON 请求正文?【英文标题】:How to access a JSON request body of a POST request in Slim? 【发布时间】:2015-03-20 08:12:36 【问题描述】:

我只是 Slim 框架的新手。我使用 Slim 框架编写了一个 API。

一个 POST 请求从 iPhone 应用程序发送到此 API。此 POST 请求采用 JSON 格式。

但我无法访问从 iPhone 发出的请求中发送的 POST 参数。当我尝试打印 POST 参数的值时,每个参数都得到“null”。

$allPostVars = $application->request->post(); //Always I get null

然后我尝试获取即将到来的请求的正文,将正文转换为 JSON 格式并将其作为响应发送回 iPhone。然后我得到了参数的值,但它们的格式很奇怪,如下所示:

"\"password\":\"admin123\",\"login\":\"admin@gmail.com\",\"device_type\":\"iphone\",\"device_token\":\"785903860i5y1243i5\""

所以可以肯定的一件事是 POST 请求参数将进入此 API 文件。尽管在$application->request->post() 中无法访问它们,但它们正在进入请求正文。

我的第一个问题是我应该如何从请求正文中访问这些 POST 参数,我的第二个问题是为什么在将请求正文转换为 JSON 格式后,请求数据会显示为上述奇怪的格式?

以下是必要的代码sn -p:

<?php

    require 'Slim/Slim.php';    

    \Slim\Slim::registerAutoloader();

    //Instantiate Slim class in order to get a reference for the object.
    $application = new \Slim\Slim();

    $body = $application->request->getBody();
    header("Content-Type: application/json");//setting header before sending the JSON response back to the iPhone
    echo json_encode($new_body);// Converting the request body into JSON format and sending it as a response back to the iPhone. After execution of this step I'm getting the above weird format data as a response on iPhone.
    die;
?>

【问题讨论】:

How to get the POST request entity using Slim framwork 的可能重复项 【参考方案1】:

一般来说,您可以通过以下两种方式之一单独访问POST 参数:

$paramValue = $application->request->params('paramName');

$paramValue = $application->request->post('paramName');

文档中提供了更多信息:http://docs.slimframework.com/#Request-Variables

当 JSON 在POST 中发送时,您必须从请求正文中访问信息,例如:

$app->post('/some/path', function () use ($app) 
    $json = $app->request->getBody();
    $data = json_decode($json, true); // parse the JSON into an assoc. array
    // do other tasks
);

【讨论】:

我试过 $application->request->params('paramName');以及 $allPostVars = $application->request->post('paramName);但我仍然没有得到任何 POST 请求变量。仅在 $body = $application->request->getBody(); 之后我正在获取 POST 请求数据。 啊我现在明白了。那么这是一个副本:***.com/questions/26346960/… 说明:您只需要在请求正文上使用json_decode 即可解析响应并获取信息。 感谢您的帮助。但是,当您了解我的确切问题时,您能否发布一个更有意义和描述性的答案以及我的代码的更正和修改版本,这将对我以及 PHP 社区的其他人有很大帮助? JSON 不会被解析为 $_POST——它作为请求正文的内容发送——因此无法使用post()params() 方法访问它。因此,要获取数据,您必须执行以下操作:json_encode($application-&gt;request-&gt;getBody(), true) 将 JSON 字符串解析为关联数组并随意使用。【参考方案2】:

“Slim 可以开箱即用地解析 JSON、XML 和 URL 编码的数据”-“请求正文”下的 http://www.slimframework.com/docs/objects/request.html

处理任何正文形式的请求的最简单方法是通过“getParsedBody()”。这将做 guillermoandrae 示例,但在 1 行而不是 2 行。

例子:

$allPostVars = $application->request->getParsedBody();

然后您可以通过给定数组中的键访问任何参数。

$someVariable = $allPostVars['someVariable'];

【讨论】:

谢谢,这是最简单的方法。

以上是关于如何在 Slim 中访问 POST 请求的 JSON 请求正文?的主要内容,如果未能解决你的问题,请参考以下文章

选项 Preflight 导致 POST 请求挂起

如何使用 Slim 框架转发 HTTP 请求

如何在 Slim 模板中访问 CoffeeScript 引擎中的实例变量

使用 tsung POST 请求发送 json

在Slim 4中访问中间件中的路由参数。

C#模拟HTTP请求Post JSON