2017-09-20 2 views
0

ich mit meiner NodeJS/Koa.js App ein seltsames Problem habe, wo eine HTTP-Anfrage Ich mache mit dieser Fehlermeldung zurückgibt:Knoten Anforderungsmodul nicht Einstellung Content-Type als application/json

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

Jetzt, wenn ich die gleiche Anfrage mit dem Postboten mache, bekomme ich korrekte Ergebnisse zurück, also habe ich gefolgert, dass etwas in meinem Code schief läuft. Ich kann es einfach nicht herausfinden. Hier ist mein Code, um die Anfrage und die Nutzlast zu machen.

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

Nutzlast:

{ 
    "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 
} 

Wie Sie sehen können, habe ich die richtigen Content-Type-Header in meinem Header haben Objekt, das in der Nutzlast I auf die Anfrage-Funktion übergeben, aber es seeems noch, als ob es wird als x-www-form-codiert gesendet. Kann jemand sehen, was hier schief gehen könnte?

Dank

Antwort

2

Die docs lesen:

  • Form - wenn ein Objekt oder eine Abfragezeichenfolgeflag geben, setzt dieser Körper auf eine Abfragezeichenfolgeflag Darstellung von Wert und fügt Content-type: application/x-www-form-urlencodierte Kopfzeile.

und

  • json - Sets Körper zu JSON Darstellung von Wert und fügt Content-type: application/json-Header.

Sie verwenden form, so überschreibt er den Header. Versuchen Sie stattdessen json zu verwenden. Es überschreibt sowieso Ihre Kopfzeile, aber der Wert wird 'application/json' sein, was in Ordnung sein sollte.

+0

Perfect! Danke – devoncrazylegs

1

ein paar Vorschläge, wenn ich darf:

  • können Sie Object.assign verwenden, um die Header in dem Objekt einzustellen.
  • Einstellung json: true kümmert sich um die richtige Content-Type-Header.
  • Sie sollten die Inhaltslänge nicht manuell festlegen müssen, es ist eine knifflige Sache zu tun. Lassen Sie Anfrage damit umgehen.
  • Wenn Sie eine Zusage zurückgeben möchten, sollten Sie die Verwendung von request-promise mit fullResponse aktivieren, um den Tokenablauf zu überprüfen.

    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

Danke! Die ursprüngliche Klasse wurde vor einer Weile geschrieben, also sollten all diese Dinge in der Neuformatierung implementiert werden. Danke für die Vorschläge. Sehr hilfreich – devoncrazylegs

Verwandte Themen