0
votes

Reste de démarrage à ressort - Le paramètre de chaîne obligatoire n'est pas présent

J'ai des problèmes avec l'envoi de données sur Spring Boot Server. Je vérifie avec le postman, tout est bon, mais j'utilise Axios Bibliothèque de ReactJS, je reçois une erreur

import axios from 'axios';
import * as Config from './../constants/Config';

export default function callApi(endpoint, method, body) {
    return axios({
        method: method,
        url: `http://localhost:8000/api/${endpoint}`,
        data: body,
        headers: {
            'Access-Control-Allow-Origin': '*' 
        }
    }).catch(err => {
        console.log(err);
    });
}


9 commentaires

Ajouter le nom de l'URL demandée comme 'Produit / Ajouter? Nom =' + produitName


Comment ressemblent votre méthode de votre controller?


Où obtenez-vous cette erreur? Comment définit votre demande sur le côté serveur? Il peut être bon de montrer également callapi


Je reçois cette erreur du serveur. I utilisateur Axios à envoyer une demande au serveur.


Est-ce que changer @requestparam à @Requestbody dans tous les paramètres CreateProduct Les paramètres résolvent votre problème?


@barbsan j'ai essayé mais j'ai toujours eu cette erreur au-dessus


Pouvez-vous montrer que Axios appelle dans callapi ? Avez-vous inspecté votre demande dans la console de votre navigateur?


J'ai vérifié et j'ai eu une erreur "Le serveur a répondu avec un statut de 400"


Par "Inspecter", je voulais comparer l'URL, les paramètres et les en-têtes avec ceux que vous envoyez avec facteur


3 Réponses :


0
votes

Le @RequestParam code> Annotation obtient ses données de l'URL. Qui devrait être comme:

? Nom = myName & Price = 100 & Status = OK CODE> P>

Le @Requestbody code> L'annotation est ce que vous recherchez si vous êtes à la recherche de Envoi des données sous forme d'objet JSON dans le corps de la demande. Assurez-vous également de définir le type code> de type code> dans votre Axios code> Demande de Application / JSON CODE> P>

axios.post('url', JSON.stringify({
        "name": productName,
        "price": productPrice,
        "status": productStatus,
     }) , { headers: {  "Content-Type": "application/json"  }
})


2 commentaires

Merci, j'ai changé d'en-tête mais une erreur de retour du serveur 'requise String Parameter' Nom 'n'est pas présente'


D'accord. Essayez d'exécuter json.stringify (données) sur votre objet de données contenant nom Price et statut . Assurez-vous également de définir les valeurs de clé de l'objet dans des guillemets doubles. Comme "nom": produitName "prix": 200 et ainsi de suite. Mal à jour ma réponse. Si cela ne fonctionne toujours pas. Veuillez enregistrer l'objet de la demande que vous recevez dans la console de système Java et ajoutez la sortie à votre question.



0
votes

Vous devez soit modifier les paramètres de votre méthode d'ajout à un seul @Requestbody produit paramètre. Ou vous devez inclure tous les paramètres de paramètre de requête dans votre demande Axios Ex: Produit / Ajouter? Nom = myName & Price = 100 & Status = OK


0 commentaires

2
votes

Votre service de repos s'attend à ce que les paramètres de demande de demande et au printemps sont obligatoires par défaut. Mais dans votre code de réact, vous n'envoyez pas ces paramètres de demande, vous les envoyez à la place, vous les envoyez en tant qu'organe de la demande.

Name est le premier param dès que ce n'est pas disponible, le nom de Spring Jantes 'Nom' non disponible, mais une fois que vous Fixez-le, il lancera le prix, puis le statut. Alors corrigez-les tous ensemble. P>

Vous devez soit modifier votre méthode de contrôleur comme ci-dessous, ce qui sera plus efficace de code et de standard de repos. P>

addProduct = (e) => {
    e.preventDefault();
    var { productName, productPrice, productStatus } = this.state;
    callApi('product/add?name=' + productName +  '&price=' + productPrice + '&status=' + productStatus , 'POST', {}).then(res => {
        console.log(res);
    });
}


4 commentaires

Le problème est que vous ne devriez jamais vraiment utiliser la méthode postale avec les paramètres de la demande. Faire cela, vous pouvez simplement coller cela dans votre navigateur http: // localhost: 8080 / produit / Ajouter? Nom = MyName & Price = 100 & STAT US = OK et cela appellera avec succès l'API et contournera toute entreprise Logique mise en œuvre sur votre client réact. Vous ne voulez pas donner accès aux données d'insérer dans votre base de données de cette façon


J'ai une question veulent vous demander. Les paramattres de l'URL au serveur correspondront au champ d'une table sur le côté serveur, non? Par exemple localhost: 8080 / produit / ... Nom, prix, statut va correspondre nom, prix, champs de statut dans la table des produits


Pas nécessairement. Par défaut, il utilise le même nom de variable pour mapper les variables Java sur le côté serveur. Mais vous pouvez modifier le @requestparam ou @Requestbody pour mapper la variable JSON à une variable Java différemment. Comme il est actuellement codé sur votre demande. Ils devraient mapper directement par défaut. Convention similaire suit lors de la cartographie de votre variable Java à une entité de base de données lorsque vous utilisez le @Table et @column annotations


Ce n'est pas le cas. En fait, le ressort prend les noms de paramètres de la méthode du contrôleur que vous avez mis le nom, le prix, le statut. Mais vous avez la possibilité de transmettre le nom de paramètre de demande différent comme ci-dessous @requestparam (nom = "DifféralName") String UNNERNAME Dans ce cas, vous devez envoyer la demande localhost: 8080 / produit / Ajouter? Nom de différentiel = nom de test et dans votre code produit.setName (un autre nom); Voici donc ici, vous pouvez voir votre demande PARAM et méthode Nom de paramètres et nom de champ de produit Tous sont différents. Et comme @nabelmewehmood suggéré à l'aide de la demande Param n'est pas recommandé pour les créations.