http模块(具有browserify的node.js)不会使用PATCH方法写请求主体

我一直在开发一个Web客户端来与REST API服务器交互,并且想要使用PATCH方法。

尽pipe我已经试图将请求主体写入PATCH的请求,但是我发现主体仍然是空的。 虽然PUT或POST工作正常。

我可以用PUT来代替,但是有人知道我的http模块的用法是错的吗?

先谢谢你。

var http = require('http'); module.exports = { patch: function(path, data, done, fail){ var jsonData = JSON.stringify(data); var options = { headers: { 'Content-Type':'application/json;charset=UTF-8', 'Content-Length':jsonData.length, } }; var req = this.request(path, "PATCH", done, fail, options); // THIS CODE DOESN'T WRITE jsonData INTO REQUEST BODY req.write(jsonData); req.end(); }, request: function(path, method, done = () => {}, fail = () => {}, options = { headers: {} } ){ options.path = path; options.method = method; return http.request(options, function(res){ var body = ''; res.setEncoding('utf8'); res.on("data", function(chunk){ body += chunk; }); res.on("end", function(){ // process after receiving data from server }); }).on("error", function(e) { // process after receiving error }); } } 

我最终使用node.js的“请求”库。 以下代码作品:

 var request = require("request"); (...) function patch(path, entity){ var deferred = q.defer(); var escapedPath = escapeSpaces(path); AuthProvider.retrieveToken().done(function (authToken){ var headers ={ 'OData-MaxVersion': '4.0', 'OData-Version': '4.0', 'Content-Type': 'application/json; charset=utf-8', 'Authorization': 'Bearer '+ authToken, 'Accept': 'application/json' } var options = { url: "https://"+resourceApiId+"/api/data/v8.0/"+escapedPath, method: 'PATCH', headers: { 'OData-MaxVersion': '4.0', "OData-Version": '4.0', "Content-Type": "application/json; charset=utf-8", "Authorization": 'Bearer '+ authToken, "Accept": "application/json" }, json: entity }; request(options, function(error, response, body){ if (!error) { console.log("patchrequest statuscode: "+response.statusCode ) deferred.resolve(true); } deferred.reject(error); } ); }); return deferred.promise; } 

我有这个代码非常同样的问题:

 function patch(path, entity){ var deferred = q.defer(); var escapedPath = escapeSpaces(path); var stringEntity = JSON.stringify(entity); AuthProvider.retrieveToken().done(function (authToken){ var options = { host: resourceApiId, path: "/api/data/v8.0/"+escapedPath, method: 'PATCH', headers: { 'OData-MaxVersion': '4.0', "OData-Version": '4.0', "Content-Type": "application/json; charset=utf-8", "Authorization": 'Bearer '+ authToken, "Accept": "application/json" } }; var reqToCrm = https.request(options, function(resFromCrm){ var body = ''; resFromCrm.on('data', function(d) { body += d; }); resFromCrm.on('end', function() { try{ var parsed = JSON.parse(body); if(parsed.error){ var errorString = "webApiRequest.js/patch: An error returned from CRM: " + parsed.error.message + "\n" +"Body Returned from CRM: " + body; console.log(errorString); deferred.reject(errorString); } deferred.resolve(parsed); } catch (error){ var errorString = "Error parsing the response JSON from CRM.\n" +"Parse Error: " + error.message + "\n" +"Response received: "+ body; console.log(errorString); deferred.reject(errorString); } }); }); reqToCrm.on('error', function(error) { console.log(error.message); deferred.reject("webApiRequest.js/post: Error returned on 'PATCH' against CRM \n" + error.message); }); reqToCrm.write(stringEntity); reqToCrm.end(); }); return deferred.promise; } 

我也已经尝试做一个POST请求并设置'X-HTTP-Method-Override':'PATCH。 也没有工作。 我不能使用任何其他的请求方法,因为Dynamics CRM禁止它。