如何使用swagger-node生成/使用XML

时间:2015-07-13 17:12:33

标签: json xml node.js swagger swagger-2.0

我是使用swagger-node(swagger-spec 2.0)的新手,我需要使用我的API来生成和生成XML和JSON(因为这是客户想要的)。目前我只关注“产品”部分。

在生成响应时,我知道我可以使用jstoxmleasyxml等工具将我的js对象转换为XML。所以问题是:在使用swagger-node时这是必要的还是假设要处理这个问题的工具?我想我的控制器代码应该返回,我需要帮助。

例如,使用swagger创建一个新项目 swagger project create myproject (choose express framework)

更改/hello api的yaml文件,以便get:同时返回json或xml

paths:
  /hello:
    # binds a127 app logic to a route
    x-swagger-router-controller: hello_world
    get:
      description: Returns 'Hello' to the caller
      # used as the method name of the controller
      operationId: hello
      produces:
        - application/json
        - application/xml

然后更改hello_world.js控制器以返回json对象而不是字符串

  // variables defined in the Swagger document can be referenced using req.swagger.params.{parameter_name}
  var name = req.swagger.params.name.value || 'stranger';
  var hello = util.format('Hello, %s!', name);

  // this sends back a JSON response which is a single string
  res.json({message:hello});
}

当我启动项目并使用带有Header Accept = application / json的Postman时 我得到了答复:

{
    "message": "Hello, stranger!"
}

如果我更改标题Accept application/xml,我仍然会收到JSON响应,而不是XML。我希望看到的是:

<object>
<message>Hello, stranger!</message>
</object>

我知道我的代码使用res.json()是错误的,因为我认为它将内容类型设置为application/json

我不知道还有什么用来产生XML响应。当我更改res.json()以使用easyxml

var xml = easyxml.render({message:hello});
res.type('xml').end(xml);

然后我从swagger得到验证错误:

[
  {
    "status": 500,
    "message": "Response validation failed: value expected to be an array/object but is not"
  }
]

那么我的控制器应如何格式化响应以返回XML或JSON?

2 个答案:

答案 0 :(得分:1)

我不确定easyxml正在做什么或为什么它不起作用,但jstoxml效果很好:

var jstoxml = require('jstoxml');
var express = require('express');
var util = require('util');
var app = express();

app.get('/', function(req, res) {
    var name = 'stranger';
    var hello = {
        object: {
            message: util.format('Hello, %s!', name)
        }
    };
    if (req.headers.accept === 'application/xml') {
        res.type('xml')
        res.end(jstoxml.toXML(hello));
    } else {
        res.json(hello);
    }
});

app.listen(process.env.PORT || 8100);

接受:application / json

{
    "object": 
    {
        "message": "Hello, stranger!"
    }
}

接受:application / xml

<object>
    <message>Hello, stranger!</message>
</object>

答案 1 :(得分:0)

显然有没有正确的方法。 瑞摩斯&#39;答案没有考虑到Swagger explicit XML support。 在任何情况下,控制器绝对不应该混淆API i / o格式,而只是实现业务逻辑。