http 模块(node.js 的 browserify)不使用 PATCH 方法写入请求正文
http module (of node.js with browserify) doesn't write request body with method PATCH
我一直在开发一个 Web 客户端来与 REST API 服务器交互,并且想使用 PATCH 方法。
虽然我尝试将请求体写入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
});
}
}
这段代码也有同样的问题:
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 禁止它。
我最终为 node.js 使用了 "request" 库。以下代码有效:
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;
}
我一直在开发一个 Web 客户端来与 REST API 服务器交互,并且想使用 PATCH 方法。
虽然我尝试将请求体写入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
});
}
}
这段代码也有同样的问题:
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 禁止它。
我最终为 node.js 使用了 "request" 库。以下代码有效:
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;
}