Die POST-Anfrage war erfolgreich, aber die Daten wurden falsch gespeichert
P粉317679342
P粉317679342 2024-02-26 17:59:55
0
1
406

Ich habe versucht, eine POST-Anfrage an den Endpunkt zu senden und habe eine Antwort von 200 erhalten, aber die von mir gesendeten Daten wurden falsch in der Datenbank gespeichert;

Ich möchte wissen, ob das Problem bei meiner Post-Anfrage oder beim Backend-Code liegt, der die Anfrage verarbeitet.

Genauer gesagt: Ich sende eine POST-Anfrage an das Laravel + MariaDB-Backend. Ich habe den Backend-Code nicht geschrieben, alle „Details“, die ich bekam, waren:

Post-Anfrage hat 3 Felder:

  • user_id: Patienten-ID
  • Passwort: Patientenpasswort (für alle Patienten gleich)
  • Nutzlast: eine JSON-Nutzlast mit der folgenden Struktur:
    • 'epoch_start' => 'Erforderlich|Nummer',
    • 'epoch_end' => 'required|numeric|gte:epoch_start',
    • 'Size' => 'Erforderlich|Anzahl|gt:0',
    • 'Temperature' => 'Erforderlich|Array|Minimum: Größe',
    • 'Pressure' => 'Erforderlich|Array|Minimum: Größe',
    • 'Move' => 'Erforderlich|Array|Min:Size',

Dies ist der Controller, der die Anfrage bearbeitet:

<?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);
        }  
    }
}

Wenn ich diese Post-Anfrage mit Postman versuche (ich habe es auch mit dem Anforderungsmodul von Curl und Python versucht), erhalte ich eine Antwort von 200 und die Daten werden auf diese Weise in der Datenbank gespeichert.

Das Problem liegt bei den Feldern „Temperatur“, „Druck“ und „Bewegung“, genauer gesagt bei den doppelten Anführungszeichen um die Arrays: Die von der Webanwendung unter Einbeziehung dieser Daten durchgeführten Berechnungen sind jedoch alle falsch, wenn ich die doppelten Anführungszeichen manuell entferne Zitate (von PHPMyAdmin) Die Berechnung ist korrekt.

Der Vollständigkeit halber hier die Tabellenstruktur.

Gibt es eine Möglichkeit, doppelte Anführungszeichen in diesen Feldern zu vermeiden?

Gibt es ein Problem mit meiner POST-Anfrage oder handelt es sich um ein Backend-Problem?

Ich kenne mich mit PHP nicht aus, aber wenn ich mich richtig erinnere, sollte die Verarbeitung dieser Daten über diese Zeilen verwaltet werden:

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

Und json_encode gibt einen String zurück, also fange ich an zu glauben, dass hier etwas mit dem Backend-Code nicht stimmt, aber ich hätte gerne eine zweite Meinung.

Vielen Dank im Voraus

EDIT: Ok, dank der Antwort von @samuel-olufemi und dem Kommentar von @sumit kann ich schlussfolgern, dass json_encode in Kombination mit dem von MariaDB verwendeten Langtext-Datentyp das Hauptproblem ist. Also habe ich versucht, die Array-Werte zu speichern, ohne sie zu kodieren, und habe diese 3 Zeilen geändert in:

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

Und auf meinen Wunsch werden die Daten ohne doppelte Anführungszeichen gespeichert. Vielen Dank für die Hilfe und Zeit aller.

P粉317679342
P粉317679342

Antworte allen(1)
P粉794177659

您的实施是正确的。该问题是由于 Maria DB 长文本数据类型管理 JSON 数据的方式造成的。

你可以看看这个答案

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

Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage