nodejs调用webservice的方法总结

lopcomvir
lopcomvir 发布于 2017-02-17 23:41:58 浏览:173 类型:原创 - 随笔 分类:Node.js - 前端经验 二维码: 作者原创 版权保护
在一次工作中,遇上了需要与第三方合作的功能,对方提供的接口是webservice
而我恰好用的是nodejs
我的第一反应当然是百度怎么调用
轻而易举搜到一个答案,用的soap模块调用
本以为会很顺利的,发现接口怎么调用都返回失败
经过仔细调试后,找到了问题所在,soap没能正确的将传入参数转换为xml
因为传入参数中有数组,数组转换不正确
比如数组本应该转换成
<Array>
  <ArrayItem>
     <field1>1</field>
     <field2>2</field>
  </ArrayItem>
<ArrayItem>
     <field1>1</field>
     <field2>2</field>
  </ArrayItem>
</Array>
结果转换成了
<Array>
     <field1>1</field>
     <field2>2</field>
<Array>
<Array>
     <field1>1</field>
     <field2>2</field>
<Array>
于是我开始调查webservice调用原理
结论是webservice是通过http以POST提交soap格式的xml数据

下面正式开始说怎么调用webservice
需要引入的模块
http、xmlreader、xmlhelper
其中xmlhelper是我自定义的对象转xml,代码参考
js转换对象为xml
如果你们不想用这个转换就另寻它法

然后拼接待提交的xml字符串
拼接格式如下
var postdata='<?xml version="1.0" encoding="utf- 8"?><soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" xmlns:tns="http://tempuri.org/"><soap:Body><MethodName xmlns="http://tempuri.org/">'
+'参数xml'+'</MethodName></soap:Body></soap:Envelope>'

说明:
参数XML前面一部分和后面一部分通过查看webservice的接口说明页拿到,比如http://hostname/WebService.asmx?op=MethodName

接下来是建立http连接,POST构建好的XML字符串
接收返回结果,返回结果也是一段XML字符串,格式在webservice的接口说明页可以查看
然后通过xmlreader解析xml,最终拿到想要的返回结果
例如
返回结果示范
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
	
	<soap:Body>
		<MethodNameResponse xmlns="http://tempuri.org/">
			<DataInfoAddResult>
				<isOk>true</isOk>
				<message>数据已提交,等待审核人员审核</message>
				<pbid>0001</pbid>
			</DataInfoAddResult>
		</MethodNameResponse>
	</soap:Body>
</soap:Envelope>

处理返回结果

var req_opt = {
            method: "POST",
            host: "hostname",
            port: 80,
            path: "/WebService.asmx",
            headers: {
                "Content-Type": "text/xml; charset=utf-8"
            }
        }
        var body;

        var http_req = http.request(req_opt, function (res) {
            res.on("data", function (d) {
                body = d;
            }).on("end", function () {
                var response = body.toString();
                console.log(response);
                xmlreader.read(response, function (err, response) {
                    if (err) {
                        //TODO:出错后
                    } else {
                        var DataInfoAddResult = response["soap:Envelope"]["soap:Body"]["MethodNameResponse"]["DataInfoAddResult"];;
                        var isOk = DataInfoAddResult.isOk.text() === "true";
                        var message = DataInfoAddResult.message.text();
                        //TODO:拿到返回结果后
                    }
                });

            }).on("error", function (err) {
                //TODO:webservice调用失败后
            });
        });
        http_req.write(postdata);
        http_req.end();


完了
z
给个赞 0 人点赞
收藏 1 人收藏
评论 已有 0 条评论;以下用户言论只代表其个人观点,不代表 前端网(QDFuns) 的观点或立场。
登录 以后才能发表评论
最新评论
还没有任何评论呢,赶紧抢先来一发吧!
lopcomvir lopcomvir 作者

GitHub:https://github.com/comvir

作者最新