Table des matières
Description du problème: JSON Post réception des données est vide
Analyse des causes profondes
Solution: configurer l'analyseur de demande JSON
Accès correct aux données JSON
Notes et résumé
Maison développement back-end tutoriel php Résolvez le problème de la réception du post-données JSON vide dans YII2

Résolvez le problème de la réception du post-données JSON vide dans YII2

Jul 23, 2025 pm 06:57 PM
apache nginx Parsing String

Résolvez le problème de la réception du post-données JSON vide dans YII2

Ce didacticiel vise à résoudre le problème que le backend ne peut pas recevoir correctement les données lors de l'envoi d'une demande de post via le contenu-type: application / JSON dans l'application YII2. Par défaut, le composant de demande de Yii2 analyse uniquement les données de formulaire traditionnelles telles que l'application / x-www-form-urlencoded. Pour s'assurer que les données JSON sont correctement identifiées et traitées, les développeurs doivent ajouter yii \ web \ jsonParser au composant de demande dans le fichier de configuration YII2, afin que le cadre puisse analyser automatiquement le corps de la demande JSON et obtenir avec succès les données soumises dans le contrôleur.

Description du problème: JSON Post réception des données est vide

Lors du développement d'applications Web, les architectures de séparation frontale et back-end envoient souvent des données de format JSON via JavaScript Fetch ou XMLHTTPRequest. Cependant, dans le cadre YII2, même si le code d'état de la demande frontale est de 200, la méthode YII :: $ app-> request-> post () dans le contrôleur back-end peut ne pas être en mesure d'obtenir les données JSON attendues, mais renvoyez plutôt une valeur nul.

Voici un exemple d'un frontal JavaScript typique envoyant des données JSON:

 Soit csrfToken = document.QuerySelector ("meta [name = 'csrf-token']"). Contenu;
Soit csrfparam = document.QuerySelector ("meta [name = 'csrf-param']"). Contenu;

fetch ("http://site.se/react/save-babysitter", {
  Méthode: "Post",
  En-têtes: {
    "Contenu-type": "application / json",
    "Accepter": "application / json",
    "CSRF-Param": CSRFPARAM, // Paramètres CSRF "X-CSRF-TOKK
  },
  corps: json.stringify ({
    'id': e.id, // Exemples de données: ID
    'nom': this.state.changename // Exemples de données: nom
  })
}). puis (réponse => réponse.json ())
  .Then ((data) => console.log (data));

Le code de contrôleur backend YII2 correspondant peut ressembler à ceci:

 Fonction publique ActionSaveBabySitter () {
    $ request = yii :: $ app-> request;
    $ name = $ request-> post ('name'); // À l'heure actuelle, la variable $ name peut être vide // Dans la question d'origine, essayez de JSON_DECODE la valeur vide, résultant en une erreur // echo json_decode ($ name); 

    // En fait, il devrait être de vérifier si $ le nom a reçu correctement si (vide ($ name)) {
        return $ this-> asjson (['status' => 'error', 'message' => 'le nom est vide']);
    } autre {
        return $ this-> asjson (['status' => 'succès', 'reçue_name' => $ name]);
    }
}

Dans ce cas, bien que le code d'état HTTP soit de 200, $ request-> post ('name') ne peut pas obtenir la valeur de nom envoyée par le frontal.

Analyse des causes profondes

Le composant de demande du framework YII2 YII \ web \ demande par défaut, seules les données de la variable globale $ _post sont analysées. Les serveurs Web (tels qu'Apache ou Nginx) analysent généralement uniquement les données corporelles de la demande avec l'application de type de contenu / x-www-form-urlencod ou multipart / form-data en variables globales $ _post.

Lorsque le côté actuel utilise le contenu: application / json pour envoyer des données, le contenu du corps de demande est la chaîne JSON d'origine, que le serveur Web ne va pas automatiquement et ne remplira pas $ _POST. Par conséquent, $ _POST reste vide, et la méthode $ request-> post () de Yii2 ne peut naturellement obtenir aucune donnée.

Solution: configurer l'analyseur de demande JSON

Pour que YII2 identifie et analyse correctement les corps de demande de type d'application / JSON, nous devons ajouter un analyseur JSON pour le composant de demande dans le fichier de configuration d'application de YII2 (généralement config / web.php).

L'opération spécifique consiste à ajouter l'attribut PARSER dans la configuration de la demande dans le tableau des composants et à spécifier que l'analyseur correspondant à l'application / json est yii \ web \ jsonParser.

 // config / web.php
Retour [
    'id' => 'your-app-id',
    // ... Autres configurations ...
    'Components' => [
        'request' => [
            'CookieValidationKey' => 'Votre secret-key', // Assurez-vous de définir une clé sûre
            'analysers' => [
                'application / json' => 'yii \ web \ jsonparser',
                // Si vous devez prendre en charge d'autres types de contenu, vous pouvez également ajouter // "application / xml '=>' yii \ web \ xmlparser ',
            ],
            // ... Autres configurations du composant de demande ...
        ],
        // ... autres composants ...
    ],
    // ... Autres configurations ...
]]

Grâce à la configuration ci-dessus, lorsque Yii2 reçoit une demande avec une application de type contenu / JSON, yii \ web \ jsonParser interviendra automatiquement, analysera la chaîne JSON dans le corps de demande dans un tableau ou un objet PHP, et le remplit dans la propriété yii :: $ app-> request-> bodyParams.

Accès correct aux données JSON

Une fois la configuration terminée, dans le contrôleur, vous pouvez obtenir des données JSON analysées via yii :: $ app-> request-> post () ou yii :: $ app-> request-> getBodyParam () tout comme l'accès aux données de post normal.

 Fonction publique ActionSaveBabySitter () {
    $ request = yii :: $ app-> request;

    // Pour le moment, YII2 a automatiquement analysé le corps de demande JSON // Vous pouvez directement obtenir le paramètre spécifique $ id = $ request-> post ('id'); 
    $ name = $ request-> post ('name');

    // ou obtenir tous les tableaux de paramètres analysés via getBodyParams () // $ data = $ request-> getBodyParams ();
    // $ id = $ data ['id'] ?? nul;
    // $ name = $ data ['name'] ?? nul;

    if (vide ($ id) || vide ($ name)) {
        Yii :: error ("Données vides reçues: id = {$ id}, name = {$ name}", __Method__);
        return $ this-> asjson (['status' => 'error', 'message' => 'id ou nom ne peut pas être vide.']);
    }

    // Exemple: traiter les données et renvoyer une réponse // par exemple, enregistrer dans une base de données et d'autres opérations // ...

    return $ this-> asjson (['status' => 'succès', 'reçue_id' => $ id, 'reçue_name' => $ name]);
}

Notes et résumé

  1. L'importance du type de contenu: lorsque le front-end envoie une demande, il est important de s'assurer que le type de contenu dans les en-têtes est défini sur Application / JSON, qui est la clé pour que l'analyseur back-end identifie et traite correctement les données JSON.
  2. Protection du CSRF: le mécanisme de protection CSRF de YII2 est toujours efficace même s'il s'agit d'une demande JSON. C'est la bonne façon d'envoyer des jetons CSRF via CSRF-Param et X-CSRF-Token dans le code JS frontal. YII2 vérifiera automatiquement ces jetons en fonction de la configuration.
  3. Vérification des données: Même si les données sont reçues avec succès, il est nécessaire de vérifier et de filtrer strictement les données reçues sur le backend pour éviter les vulnérabilités de contribution et de sécurité malveillantes.
  4. getBodyParams () et post (): yii :: $ app-> request-> Post () Méthode Une fois que l'analyseur JSON a été configuré, il trouvera automatiquement la valeur de la clé correspondante à partir des bodyparams analysés. Par conséquent, en général, utilisez simplement la méthode post () directement. Si vous avez besoin d'obtenir tous les tableaux de paramètres analysés, vous pouvez utiliser getBodyParams ().
  5. Autres analyseurs: Si votre application doit également gérer d'autres corps de demande de formulaires non standard (tels que XML), vous pouvez également configurer les analyseurs correspondants dans les analyseurs.

Grâce à la configuration ci-dessus, les applications YII2 pourront traiter de manière transparente les demandes de format JSON envoyé par le frontal, assurant la transmission et le traitement corrects des données, améliorant ainsi l'efficacité de la collaboration frontale et de la robustesse des applications.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

Porce de variable PHP expliquée
1 Il y a quelques mois By 百草
Conseils pour écrire des commentaires PHP
4 Il y a quelques semaines By 百草
Commentant le code en php
4 Il y a quelques semaines By 百草
<🎜>: Grow A Garden - Guide complet des marchands itinérants
3 Il y a quelques semaines By Jack chen

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

Tutoriel PHP
1510
276
Comment utiliser PHP pour développer une plate-forme communautaire Q&A explication détaillée du modèle de monétisation communautaire interactive PHP Comment utiliser PHP pour développer une plate-forme communautaire Q&A explication détaillée du modèle de monétisation communautaire interactive PHP Jul 23, 2025 pm 07:21 PM

1. Le premier choix pour la combinaison Laravel Mysql Vue / React dans la communauté de questions et réponses de développement PHP est le premier choix pour la combinaison Laravel Mysql Vue / React, en raison de sa maturité dans l'écosystème et de l'efficacité de développement élevée; 2. Les performances élevées nécessitent une dépendance à la cache (redis), une optimisation de la base de données, des files d'attente CDN et asynchrones; 3. La sécurité doit être effectuée avec le filtrage d'entrée, la protection CSRF, les HTTP, le cryptage de mot de passe et le contrôle d'autorisation; 4. Publicité facultative, abonnement aux membres, récompenses, commissions, paiement des connaissances et autres modèles, le noyau est de faire correspondre le ton communautaire et les besoins des utilisateurs.

Qu'est-ce qui provoque une erreur 'trop ​​de fichiers ouverts' dans Nginx? Qu'est-ce qui provoque une erreur 'trop ​​de fichiers ouverts' dans Nginx? Jul 05, 2025 am 12:14 AM

Lorsque Nginx connaît une erreur "ToomyOpenFiles", c'est généralement parce que le système ou le processus a atteint la limite du descripteur de fichier. Les solutions incluent: 1. Augmenter les limites douces et dures du système Linux, définir les paramètres pertinents de Nginx ou exécuter les utilisateurs dans /etc/security/limits.conf; 2. Ajustez la valeur Worker_Connections de Nginx pour s'adapter au trafic attendu et assurer la configuration surchargée; 3. Augmentez la limite supérieure des descripteurs de fichiers au niveau du système fs.file-max, edit /etc/sysctl.conf et appliquez des modifications; 4. Optimiser l'utilisation du journal et des ressources et réduisez l'utilisation de la poignée des fichiers inutile, comme l'utilisation d'Open_L

Comment configurer l'agrafage OCSP dans Apache pour de meilleures performances SSL? Comment configurer l'agrafage OCSP dans Apache pour de meilleures performances SSL? Jul 05, 2025 am 12:03 AM

ToenableocspstaplingInapache, assurez-vous que vous êtes en train de vous-même

Comment créer un environnement PHP Nginx avec MacOS pour configurer la combinaison des services Nginx et PHP Comment créer un environnement PHP Nginx avec MacOS pour configurer la combinaison des services Nginx et PHP Jul 25, 2025 pm 08:24 PM

Le rôle principal de Homebrew dans la construction de l'environnement Mac est de simplifier l'installation et la gestion des logiciels. 1. Homebrew gère automatiquement les dépendances et encapsule les processus de compilation et d'installation complexes en commandes simples; 2. Fournit un écosystème de package logiciel unifié pour assurer la normalisation de l'emplacement et de la configuration de l'installation logicielle; 3. Intègre les fonctions de gestion des services et peut facilement démarrer et arrêter les services via BrewServices; 4. Mise à niveau et maintenance des logiciels pratiques et améliore la sécurité et les fonctionnalités du système.

Comment régler Apache pour de meilleures performances? Comment régler Apache pour de meilleures performances? Jul 08, 2025 am 12:37 AM

Pour améliorer les performances Apache, optimiser les paramètres de configuration sont nécessaires. 1. Ajustez les paramètres Keepalive: activez MaxkeepaliveRequests et définissez 500 ou plus, et définissez KeepaliveTimeout à 2 ~ 3 secondes pour réduire les frais généraux de connexion. 2. Configurez le module MPM: Définissez Starterservers, MinsPareServers, MaxsPareServers et MaxClients en mode préfigue; Définissez ThreadsperChild et MaxRequestworkers en mode événement ou travailleur pour éviter une charge excessive. 3. Utilisation de la mémoire de contrôle: basée sur l'utilisation de la mémoire d'un seul processus

Comment activer HTTP Strict Transport Security (HSTS) dans Apache? Comment activer HTTP Strict Transport Security (HSTS) dans Apache? Jul 13, 2025 am 01:12 AM

Permettre à HSTS de forcer les navigateurs à accéder aux sites Web via HTTPS, en améliorant la sécurité. 1. Pour activer HTTPS dans Apache, vous devez d'abord configurer HTTPS, puis ajouter l'en-tête de réponse STRICT-Transport-Security dans le fichier de configuration du site ou .htaccess; 2. Pour configurer l'âge maximum (tel que 31536000 secondes), inclut les paramètres debdomains et préchargement; 3. Assurez-vous que le module mod_headers est activé, sinon exécutez Sudoa2enModHeaders et redémarrez Apache; 4. Vous pouvez éventuellement vous soumettre à la liste HSTSPReload, mais il doit satisfaire que le site principal et le sous-domaine prennent en charge les HTTPS.

Comment configurer le pare-feu Windows 11 pour permettre aux services PHP PHP ouverts et sécurisés paramètres Comment configurer le pare-feu Windows 11 pour permettre aux services PHP PHP ouverts et sécurisés paramètres Jul 23, 2025 pm 06:27 PM

Pour permettre aux services PHP de passer par le pare-feu Windows 11, vous devez créer des règles entrantes pour ouvrir le port ou le programme correspondant. 1. Déterminez le port que PHP écoute réellement. Si le serveur intégré est démarré avec PHP-SlocalHost: 8000, le port est 8000. Si vous utilisez Apache ou IIS, il est généralement de 80 ou 443. 2. Ouvrez les paramètres avancés de "Windowsdefender Firewall", créez une nouvelle règle entrante, sélectionnez "programme" ou "port", remplissez le chemin PHP ou le serveur Web ou spécifie le numéro de port. 3. Sélectionnez Autoriser les connexions, vérifier le fichier de configuration du réseau applicable, nommer les règles et ajouter une description. Les adresses IP qui sont autorisées à accéder, telles que le réseau local ou la propriété intellectuelle spécifique, peuvent être restreintes via la portée. Sécurité

Quel est le répertoire de racine Web par défaut pour Apache? Quel est le répertoire de racine Web par défaut pour Apache? Jul 15, 2025 am 01:51 AM

Le répertoire de racine Web par défaut d'Apache est / var / www / html dans la plupart des distributions Linux. En effet, le serveur Apache fournit des fichiers à partir d'un répertoire racine de document spécifique. Si la configuration n'est pas personnalisée, des systèmes tels que Ubuntu, CentOS et Fedora utilisent / var / www / html, tandis que macOS (utilisant Homebrew) est généralement / usr / local / var / www, et que Windows (xAMPP) est c: \ xAMPP \ htdocs; Pour confirmer le chemin actuel, vous pouvez vérifier le fichier de configuration Apache tel que httpd.conf ou apache2.conf, ou créer un p avec phpinfo ()

See all articles