2013年6月22日 星期六

About HTTP delete method error response

記錄一個比較不常用到的操作方式...
以client使用request module為例...
http delete method中,某些client遇到error時,解讀回覆部分不是直接取用body
而是去解析error物件來做回覆
此時如何從server端製作一個錯誤來讓client操作呢...

下面是client端的模擬code,主要client端想要取出callback function中的error物件...

Client side:
var opts = {url:'http://localhost:1337/test/123', method:'DELETE'};
request(
  opts, 
  function(error,res,body) {
    console.log(e);
  }
);

此時server side的實作,以express為例,只需要在res.send()中依序帶入:
  • 第一個欄位設定錯誤代碼
  • 第二個欄位為錯誤物件描述,建議以JSON為格式(預設格式為{code: xxx, message:xxx},若符合此格式,回覆時候匯自動取message內文做為error的message欄位,並會在error物件中多一個code的欄位}
下面模擬del協定,於呼叫時候丟錯:

Server side:
app.del('/test/:id', function(req, res) {
  res.send(400, {code:"test error", message:"the tested error"});
});

此時client的console pring匯出現下面訊息:

Client result: 
{ message: 'the tested error',
  body: { code: 'test error', message: 'the tested error' },
  httpCode: 400,
  statusCode: 400,
  restCode: 'test error',
  code: 'test error' }

如上描述,如果server改寫response回傳物件(不使用預設格式)...

Server side:
app.del('/test/:id', function(req, res) {
  res.send(400, {coder:"test error", msg:"the tested error"});
});

則,error物件會長這樣子:

{ message: '{\n  "coder": "test error",\n  "msg": "the tested error"\n}',
  body: { coder: 'test error', msg: 'the tested error' },
  httpCode: 400,
  statusCode: 400 }