La requête POST a réussi, mais les données ont été enregistrées de manière incorrecte
P粉317679342
P粉317679342 2024-02-26 17:59:55
0
1
383

J'ai essayé d'envoyer une requête POST au point de terminaison et j'ai reçu une réponse de 200, mais les données que j'ai envoyées n'ont pas été enregistrées correctement dans la base de données ;

Je veux savoir si le problème vient de ma demande de publication ou du code backend qui gère la demande.

Plus précisément : j'envoie une requête POST au backend Laravel + MariaDB. Je n'ai pas écrit le code backend, tous les "détails" que j'ai obtenus étaient :

La demande de publication comporte 3 champs :

  • user_id : identifiant du patient
  • Mot de passe : Mot de passe du patient (identique pour tous les patients)
  • payload : une charge utile json avec la structure suivante :
    • 'epoch_start' => 'Obligatoire|Numéro',
    • 'epoch_end' => 'required|numeric|gte:epoch_start',
    • 'Taille' => 'Obligatoire|Nombre|gt:0',
    • 'Temperature' => 'Obligatoire|Tableau|Minimum : taille',
    • 'Pressure' => 'Obligatoire|Tableau|Minimum : taille',
    • 'Move' => 'Obligatoire|Tableau|Min:Taille',

C'est le contrôleur qui gère la demande :

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Validator;
use Response;
use App\Models\User;
use App\Models\Sensor;
use Carbon\Carbon;

class SensorController extends Controller
{
    public function storeData(Request $request) {
        if ($request->has(['user_id', 'password', 'payload'])) {
            $password = $request->get('password');
            $user_id = $request->get('user_id');

            $user = User::where('id', $user_id)->firstOrFail();
            if($user->role != "patient") return new Response('Forbidden', 403);
            if($password != "HIDDENPASS") return new Response('Forbidden', 403);


            $payload = $request->get('payload');
            $data = json_decode($payload, true);

            $rules = [
                'epoch_start' => 'required|numeric',
                'epoch_end' => 'required|numeric|gte:epoch_start',
                'size' => 'required|numeric|gt:0',
                'temperature' => 'required|array|min:size',
                'pressure' => 'required|array|min:size',
                'movement' => 'required|array|min:size',
                'temperature.*' => 'numeric',
                'pressure.*' => 'numeric',
                'movement.*' => 'numeric',
            ];

            $validator = Validator::make($data, $rules);

            if ($validator->passes()) {
                $s = new Sensor;
                $s->user_id = $user->id;
                $s->epoch_start = Carbon::parse($data["epoch_start"]);
                $s->epoch_end = Carbon::parse($data["epoch_end"]);
                $s->size = $data["size"];
                $s->temperature = json_encode($data["temperature"]);
                $s->pressure = json_encode($data["pressure"]);
                $s->movement = json_encode($data["movement"]);
                $s->save();
                response()->json(['success' => 'success'], 200);
            } else {
                dd($validator->errors());
            }

        } else {
            return new Response('Forbidden', 403);
        }  
    }
}

Si j'essaie cette requête Post en utilisant Postman (j'ai également essayé d'utiliser le module de requêtes curl et python), j'obtiens une réponse 200 et les données sont enregistrées dans la base de données de cette façon.

Le problème vient des champs "Température", "Pression" et "Mouvement", plus précisément les guillemets autour des tableaux : les calculs effectués par l'application web impliquant ces données sont tous faux, cependant, si je supprime manuellement les doubles citations (de PhpMyAdmin), le calcul est correct.

Pour être complet, voici la structure du tableau.

Existe-t-il un moyen d'éviter les guillemets doubles autour de ces champs ?

Y a-t-il un problème avec ma requête POST, ou s'agit-il d'un problème lié au backend ?

Je ne connais pas PHP, mais si je me souviens bien, le traitement de ces données doit être géré par ces lignes :

$s->temperature = json_encode($data["temperature"]);
$s->pressure = json_encode($data["pressure"]);
$s->movement = json_encode($data["movement"]);

Et json_encode renvoie une chaîne, donc je commence à penser qu'il y a quelque chose qui ne va pas avec le code backend ici, mais j'aimerais un deuxième avis.

Merci d'avance

EDIT : Ok, grâce à la réponse de @samuel-olufemi et au commentaire de @sumit, je peux conclure que json_encode combiné avec le type de données texte long utilisé par MariaDB est le principal problème. J'ai donc essayé de stocker les valeurs du tableau sans les encoder, j'ai changé ces 3 lignes en :

$s->temperature = $data["temperature"];
$s->pressure = $data["pressure"];
$s->movement = $data["movement"];

Et selon mon souhait, les données sont stockées sans guillemets doubles. Merci pour l'aide et le temps de chacun.

P粉317679342
P粉317679342

répondre à tous(1)
P粉794177659

Votre implémentation est correcte. Le problème est dû à la manière dont le type de données texte long Maria DB gère les données JSON.

Vous pouvez consulter cette réponse

https://dba.stackexchange .com/questions/192754/json-functions-double-quotes-added-when-going-through-a-variable

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal