2016-03-30 14 views
1

私はREST APIサーバーと対話するためのWebクライアントを開発しており、PATCHメソッドを使用したいと考えています。HTTPモジュール(browserifyを使用したnode.jsの)は、リクエスト本体にメソッド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 
    }); 
    } 
} 

答えて

1

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; 
} 
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-法-上書き' を設定してみました:「PATCH。どちらもうまくいきませんでした。 Dynamics CRMはそれを禁止しているので、他のどのRequestメソッドも使用できません。

+0

私はどちらかといえば、代わりにPOSTを使用しました。あなたの経験を共有してくれてありがとう! – tsuda7

関連する問題