2017-10-20 10 views
0

Je fais une opération de sauvegarde qui, lorsque les données sont invalides, la réponse est un statut HTTP 400 avec les détails dans le corps JSON. Je veux lire le JSON afin que je puisse l'afficher ci-dessous est le code que je l'ai utilisé, mais rien ne semble travailler à obtenir une réponse du corps d'erreur 400Fetch, obtention d'une erreur 400 lisant le JSON

private _onSave() { 
    let e: EmployeeSaveEntity = this.state.employeeSave; 
    this._save(e, this._onResponse.bind(this) , this._onCheckError.bind(this)); 
    } 

    public _save(employee: EmployeeSaveEntity, onFulfilled: any, onReject: any) { 
    let url: string = __URL__; 
    url += 'Employees'; 

    let context: any = this; 
    let res: Promise<Response>; 
    try { 
     res = fetch(url, 
      { 
       //"cors" | "navigate" | "same-origin" | "no-cors" 
       //mode:"no-cors", 
       method: "POST", 
       headers: { 
        'Authorization': `Bearer ${context._authentication.token.access_token}`, 
        "Content-Type": "application/json" 
       }, 
       body: employee.getJSON() 
      }).then(onFulfilled, onReject); 
     } 
     catch (error) { 
      throw new Error('Failed to save employee'); 
     }; 
} 

    private _onCheckError(value: any) { 
    console.log('_onCheckError'); 
    console.log(value); 
    } 

    private _onResponse(value: Response) {  
    console.log('_onResponse'); 
    console.log(value); 
    console.log(value.text()); 
    value.json().then(this._onJson.bind(this), this._onCheckError.bind(this)); 
    } 
    private _onJson(value: any) { 

    console.log('_onJson'); 
    console.log(value); 
    } 

HTTP/1.1 400 Bad Request Cache-Control: no-cache Pragma: no-cache Transfer-Encoding: chunked Content-Type: application/json; charset=utf-8 Expires: -1 Date: Fri, 20 Oct 2017 14:50:33 GMT X-Response-From: 10.50.46.29

{"HierId":[ "You can not insert master table data into the system at this hierarchy level." ], "PrimaryPhoneNumberCountryCallingCode":[ "The PrimaryPhoneNumberCountryCallingCode is required when PrimaryPhoneNumber has a value." ] }

+0

Vous n'êtes pas envoyer 'contenu length' dans vos têtes. Cela peut être un problème. De la RFC, "les applications DEVRAIENT utiliser ce champ pour indiquer la longueur de transfert du corps du message, à moins que cela ne soit interdit par les règles de la section 4.4." –

+0

'application/json' ne possède pas ** de charset. –

+0

La longueur de contenu n'est pas nécessaire, l'extraction l'ajoute à l'en-tête. Tout cela fonctionne quand les données sont correctes je reçois une réponse de 200 et tout fonctionne. Ce que je veux vraiment savoir, c'est comment lire le corps d'une mauvaise requête. – user1730289

Répondre

0

Depuis la requête HTTP a réussi (vous avez obtenu toute réponse) alors le résultat sera simplement passé à la méthode onFulfilled.

Regardez cet exemple:

fetch("/error").then((response) => { 
    console.log(response.status); //400 in your case 
    response.json().then((errorJson) => { 
     console.log(errorJson); // should return the error json 
    }); 
}) 
+0

Ceci est similaire à l'exemple que j'ai utilisé mais mon statut revient à 0. Je dois ajouter le mode: "no-cors", à ma demande pour l'obtenir plus loin, et ensuite je reçois le message suivant ** Uncaught (in promesse) SyntaxError: fin inattendue d'entrée à eval (eval à ./components/employee.tsx (app.5319b150089f3650765c.js: 8370), : 233: 26) à ** – user1730289

+0

@ user1730289 Ajout mode »: ' no-cors '"indique aux navigateurs de bloquer votre code JavaScript frontend de tout accès à la réponse. – sideshowbarker

+0

K mais je ne l'ajoute pas Je reçois ceci ** Impossible de charger https: // domaine/Employés: Aucun en-tête 'Access-Control-Allow-Origin' n'est présent sur la ressource demandée. L'origine 'https: // localhost: 3000' n'est donc pas autorisée. La réponse possédait le code d'état HTTP 400. Si une réponse opaque répond à vos besoins, définissez le mode de la demande sur 'no-cors' pour extraire la ressource avec CORS désactivé. ** – user1730289