我一直在开发一个与REST API服务器交互的Web客户端,并且想要使用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
});
}
}
答案 0 :(得分:1)
我对此代码有同样的问题:
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。也没用。我不能使用任何其他Request方法,因为Dynamics CRM禁止它。
答案 1 :(得分:1)
我最终使用了"请求" 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;
}