【问题标题】:read JSON input in slim framework在 slim 框架中读取 JSON 输入
【发布时间】:2016-09-15 12:14:33
【问题描述】:

按照教程,我是苗条框架的新手,我设法将数据发送到我的 API。但是当我尝试以 JSON 格式发送数据时,它给了我一个错误。我尝试按如下方式接受 JSON 请求什么是正确的语法实现这一点。我收到错误,因为必填字段名称、电子邮件、密码丢失或为空

$app->post('/login', function() use ($app) {
                // check for required params
                $json = $app->request->getBody();
                $data = json_decode($json, true); 
                verifyRequiredParams(array('name','email', 'password'));

如何从我的 API 中的一个 JSON 数组中的 post 请求中获取 json 数据,例如

{
"name":"usertest",
"email":"xxxx@xxx.xxx",
"password":"xxxxxx"
}

如果请求是 JSON 格式,我可以使用 verifyRequiredParams(array('name','email', 'password'));$name = $app->request->post('name');

【问题讨论】:

  • 您的意思是要将数组转换为 JSON?
  • 对不起,如果我使用了错误的术语。我担心的是如果我们在 post 方法中发送一个 JSON 数据数组如何读取它,比如 $email = $app->request->post('email ') 一样吗?我认为当我尝试验证参数时会出现错误。我将添加一个示例发布数组来提问。
  • 我添加了一个解决方案。如果没有解决您的问题,请发布$data的内容(如print_r($data);

标签: php json slim


【解决方案1】:

要读取请求数据,您可以使用 $data 属性。它应该是一个对象,因此您可以像这样使用它:

$name = $data->name;
$email = $data->email;

编辑:

使用$data = json_decode($json)而不是$data = json_decode($json, true)将json数据转换为对象而不是关联数组。

【讨论】:

    【解决方案2】:

    我认为问题在于放置我的verifyRequiredParams 函数。我通过以下代码解决了这个问题,以防有人遇到同样的问题。

    $app->post('/login', function() use ($app) {
                if($app->request->headers->get('Content-Type')=='application/json'){
                    $json = $app->request->getBody();
                    verifyRequiredParamsjson(array('email','password'),$json); 
                    $data = json_decode($json); 
    
                    // check for required params                            
    
                    $email = $data->email;
                    $password = $data->password;
                }
                else{
                    // check for required params
                    verifyRequiredParams(array('email', 'password'));
                    // reading post params
                    $email = $app->request->post('email');
                    $password = $app->request->post('password');
                }
    
                $response = array();
    
                $db = new DbHandler();
                // check for correct email and password
                if ($db->checkLogin($email, $password)) {
                    // get the user by email
                    $user = $db->getUserByEmail($email);
    
                    if ($user != NULL) {
                        $response["error"] = false;
                        $response['name'] = $user['name'];
                        $response['email'] = $user['email'];
                        $response['apiKey'] = $user['api_key'];
                        $response['createdAt'] = $user['created_at'];
                    } else {
                        // unknown error occurred
                        $response['error'] = true;
                        $response['message'] = "An error occurred. Please try again";
                    }
                } 
                else{
                        $response['error'] = true;
                        $response['message'] = 'Login failed. Incorrect credentials';
                    }
    
                echoRespnse(200, $response);
            });
    

    需要的参数检查,

    function verifyRequiredParams($required_fields) {
        $error = false;
        $error_fields = "";
        $request_params = array();
        $request_params = $_REQUEST;
        // Handling PUT request params
        if ($_SERVER['REQUEST_METHOD'] == 'PUT') {
            $app = \Slim\Slim::getInstance();
            parse_str($app->request()->getBody(), $request_params);
        }
        foreach ($required_fields as $field) {
            if (!isset($request_params[$field]) || strlen(trim($request_params[$field])) <= 0) {
                $error = true;
                $error_fields .= $field . ', ';
            }
        }
    
        if ($error) {
            // Required field(s) are missing or empty
            // echo error json and stop the app
            $response = array();
            $app = \Slim\Slim::getInstance();
            $response["error"] = true;
            $response["message"] = 'Required field(s) ' . substr($error_fields, 0, -2) . ' is missing or empty';
            echoRespnse(400, $response);
            $app->stop();
        }
    } 
    

    【讨论】:

      猜你喜欢
      • 2018-03-22
      • 1970-01-01
      • 2013-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-24
      相关资源
      最近更新 更多