繁体   English   中英

Express API JSON 和 XML POST 请求

[英]Express API JSON and XML POST request

我有一个允许 json 发布请求的快速 API。 但是,在我的场景中,我的 API 之一需要接受 XML 帖子正文,而不是 JSON 正文。

所以我的快递应用程序设置得很好:

// Init App
var app = express();

// BodyParser Middleware
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
    extended: false
}));

这是我的 POST api JSON 路由示例:

router.post('/', function(req, res, next) {
  defaultPoll.create(req.body, function(err, post) {
    if (err) { console.log(err)
    } else {res.json(post);
  }
  });
});

当我传入我的 json 值时效果很好,例如这是我的 Post 请求:

{
    "milliseconds":"600"
}

但是现在我有一个 API,我想在其中执行 POST 请求,但是我的 POST 请求需要作为 XML 发送。 所以这就是我的 API 的样子:

router.post('/test', function(req, res) {
    var body = req
    console.log(body)
});

没什么复杂的,因为我没有得到任何东西。 这就是我执行 POST 请求的方式:

<?xml version="1.0"?>
<methodCall>
   <methodName>myMethod</methodName>
    <params>
      <param>
         <value><string>hello</string></value>
      </param>
   </params>
</methodCall>

然而,我的身体空空如也。 知道我该如何解决这个问题吗? 理想情况下,我希望接受此 XML 请求,然后也使用我选择的 XML 进行响应。 做这个的最好方式是什么?

接受请求,转换为 JSON,编写 JSON 响应并转换回 XML 响应?

任何帮助将不胜感激!

bodyParser 仅支持以下格式(如果您使用的是 body-parser):

  • JSON 正文解析器
  • 原始身体解析器
  • 文本正文解析器
  • URL 编码的表单正文解析器

所以如果你想解析 XML 我建议你使用 express-xml-bodyparser

var xmlparser = require('express-xml-bodyparser');
app.use(xmlparser());

app.post('/test', function(req, res, next) {
  // req.body contains the parsed xml 
});

我希望这可以帮助您朝着正确的方向前进

我知道现在已经很晚了,但是,如果您想同时使用 xml 和 json,则可以将它与这样的特定 xml 请求一起使用,

app.post('/receive-xml', xmlparser({trim: false, explicitArray: false}), function(req, res, next) {
  // check req.body  
});

我相信你可以使用它不同的路线

appRoute1.js

const express = require('express');
const router = express.Router();
const bodyParse = require('body-parser');
const cookieParser = require('cookie-parser');

const xmlparser = require('express-xml-bodyparser');
 router.use(xmlparser());

router.use(bodyParse.json());
router.use(bodyParse.urlencoded({extended:true}));
router.use(cookieParser());

router.use((req, res, next)=>{
    if(req.header('Content-Type').endsWith("xml")){
        parser.parseString(req.body, (err, data)=>{
            console.log('xml data',data);
            next();
        })
    }
    next();
});
//router.use(courseRequestInterceptor);
router.get('/test', (req,res, next)=>{
    console.log('Inside router test', req);

    //write a sample cookie to be sent to client
    res.cookie('testCookieKey', 'testCookieValue');
    res.write(JSON.stringify({id:1, test:'test'}, null, 2));
    res.end();
}),
router.post('/v1/postSampleCourse',(req,res, next)=>{
    console.log('cookies', req.cookies);


    res.cookie('appName', 'server_demo');
    debugger;
    //maybe add a validation like Joi validation for the input data
    res.write(JSON.stringify(['record created successfully', req.headers, 
    req.body.id], null, 2));
    res.end();

});



module.exports = router;

appRoute2.js

const express = require('express');
const router = express.Router();
//const constants = require('./../utils/constants');
const bodyParser = require('body-parser');

router.use(bodyParser.json());
router.use(bodyParser.urlencoded({extended:true}));
module.exports = router;

router.get('/addHeaders', (req, res, next)=>{
    req.headers['testHeader']='testHeaderValue';
    //req.accepts() gets the Accept content negotiation of the incoming request, exaple if its xml or json, or ecmascript
    // or stream
    //req.header() requires a name of the header to see
    console.log(req);
    console.log('request headers', req.header('origin'));
    res.header('testHeaderResponseKey', 'testHeaderResponseValue');
    //
    res.write(JSON.stringify({id:1}));
    //u can either do res.end() which will end the response and generate the result
    // or pipe the response and call next() which will also end the result
    req.pipe(res);
    next();
} )

可执行文件

const process = require('process');
const _ = require('lodash');
const util =require('util');
const express = require('express');
const app  = express();

const bodyParser = require('body-parser');
//Extract arugments from command line
const argumentExtractor = require('./utils/argumentExtrator');

//make use of constants
const constants = require('./utils/constants');

//sample to make use of cors router
// const corsRouter = require('./controllers/corsRoute');
// app.use(corsRouter);
console.log('env vars', process.env);

app.use(bodyParser.json());
app.use(bodyParser.raw({type: () => true}));

const corsHeaders = require('./middlewares/corsHeaders');
app.use(corsHeaders);

//additional response headers
const addition_headers = require('./middlewares/additionalReponseHeaeders');
app.use(addition_headers);
debugger;


//Routing sample1
const appRouter1 = require('./controllers/appRoute1');
app.use(constants.COURSE_ROUTE,appRouter1);

//Routing sample 2
const appRouter2 = require('./controllers/appRoute2');
app.use(constants.HEADER_ROUTE, appRouter2);



//getting the commandline properties
console.log('command line arguments');
_.each(process.argv, (data)=>{

    console.log('each data', data);

});
console.log('env from argument',argumentExtractor.env);
console.log('port from argument',argumentExtractor.port);

//spread opertaor example
const oldArray = ['1', 2];
const newArray = [...oldArray];
console.log(newArray);

//Rest operator- basically to handle mutiple inputs
const sampleFunc = (...params)=>{
    return params;
}
console.log(sampleFunc(3,4));
console.log(sampleFunc(3,4,5,6 ));

const port = argumentExtractor.port || 3000;
app.listen(port, () => {
    console.log(`Server started on port..${port})`);
});

还有其他部分需要存在其他文件才能执行,但显示了路由器部分以及如何基本使用 xml 解析单个路由

主体是一个可读流,可以由块组成。

你可以在处理程序中做这样的事情。

let body = "";
let response = {}; 
if (req.method === "POST") {
        req.on("data", chunk => {
            body += chunk.toString();
        });
        req.on("end", () => {
            response.message = "Success";
            response.data.length = body.length;
            return res.status(200).json(response);
        });
    }

router.use(bodyparser.raw({ type: 'application/xml' })); XML 正文将被解析,并将采用 Buffer 格式。 在路由中,您可以执行类似new Buffer(req.body.data).toString()来获取原始请求正文。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM