2017-09-20 5 views
0

J'ai un problème étrange avec ma NodeJS/app Koa.js où une requête HTTP que je fais est de retour avec ce message d'erreur:module de demande noeud non mise Content-Type application/JSON

{"Message":"The request entity's media type 'application/x-www-form-urlencoded' is not supported for this resource." 

Maintenant, quand je fais la même demande en utilisant un postier, je reçois des résultats corrects, donc j'ai déduit que quelque chose ne va pas dans mon code. Je n'arrive juste pas à comprendre. Voici mon code pour faire la demande et la charge utile.

// Content Type 
     if(options.contentType === 'json') { 
      headers['Content-Type'] = 'application/json'; 
     } 

     // Content Length 
     if(options.contentLength) { 
      reqHeaders['Content-Length'] = options.contentLength 
     } 

     if(headers) { 
      for(let key in headers) { 
       if(!headers.hasOwnProperty(key)) { 
        continue; 
       } 

       reqHeaders[key] = headers[key]; 
      } 
     } 

     const payload = { 
      headers : reqHeaders, 
      url  : url, 
      method : requestType, 
      timeout : 10000, 
      form : vars, 
      followRedirect: true, 
      maxRedirects: 10, 
      body : '' || options.body 
     }; 

     return new Promise(function(resolve, reject) { 
      request(payload, function(error, response, body) { 
       if(response) { 
        if(!error && response.statusCode === 200) { 
         resolve(response, body); 
        } else { 
         if(response.statusCode === 401) { 
          console.log('token expired'); 
         } 
         reject(response, body); 
        } 
       } 
      }); 
     }); 

Payload:

{ 
    "headers": { 
    "Cookie": "XDEBUG_SESSION=PHPSTORM", 
    "Authorization": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJkZWdvdWxkLWxvZ2luLmRldiIsImFjY291bnQiOiI1OTY3NmFmZmYyOWE1NWI2MTViOWFiMWEiLCJhdXRoTGV2ZWwiOjAsImlhdCI6MTUwNTg5OTQ3MX0.r-XaeTsQTjSkab9SNjrHgnh6lrgNP0uJCaDIV22A6gM", 
    "Content-Type": "application/json" 
    }, 
    "url": "http://54.***.***/api/Report/History", 
    "method": "POST", 
    "timeout": 10000, 
    "form": { 
    "AccountId": "59676afff29a55b615b9ab1a", 
    "StartDate": "2017-09-19T10:11:47.0266607+00:00", 
    "EndDate": "2017-09-19T10:11:47.0266607+00:00", 
    "VIN": "SALLAK" 
    }, 
    "followRedirect": true, 
    "maxRedirects": 10 
} 

Comme vous pouvez le voir, je les corriger en-têtes Content-Type dans mes têtes objet qui est dans la charge utile que je passe à la fonction de la demande, mais il seeems encore comme si il envoie en tant que x-www-form-encoded. Quelqu'un peut-il voir ce qui peut aller mal ici?

Merci

Répondre

2

La lecture docs:

  • forme - lorsqu'il est passé d'un objet ou d'un querystring, cela crée corps à une représentation querystring de la valeur, et ajoute du contenu de type: application/En-tête x-www-form-urlencoded.

et

  • JSON - corps ensembles à la représentation JSON de la valeur et ajoute Content-Type: application/tête JSON.

Vous utilisez form, il remplace l'en-tête. Essayez plutôt d'utiliser json. Il écrasera votre entête de toute façon, mais la valeur sera 'application/json' ce qui devrait être correct.

+0

Parfait! Merci – devoncrazylegs

1

quelques suggestions si je peux me permettre:

  • Vous pouvez utiliser Object.assign pour définir les en-têtes dans l'objet.
  • Le réglage json: true prendra soin de placer le bon en-tête de type de contenu.
  • Vous ne devriez pas avoir à définir la longueur du contenu manuellement, c'est une chose délicate à faire. Laissons la requête s'occuper de ça.
  • Si vous souhaitez renvoyer une promesse, envisagez d'utiliser request-promise avec fullResponse activé pour vérifier l'expiration du jeton.

    if(headers) { 
        Object.assign(reqHeaders, headers); 
    } 
    
    const payload = { 
        headers: reqHeaders, 
        url: url, 
        method: requestType, 
        timeout: 10000, 
        json: true, 
        followRedirect: true, 
        maxRedirects: 10, 
        body: options.body || {}, 
        fullResponse: true 
    }; 
    
    return rp(payload).then(function(response) { 
        if (response.statusCode === 401) { 
        throw Error('Token expired'); 
        } 
        return response.body; 
    }); 
    
+0

Merci! La classe originale a été écrite il y a quelque temps donc toutes ces choses devaient être implémentées dans le reformat. Merci pour les suggestions cependant. Très utile – devoncrazylegs