将webservice的WSDL接口转化成HTTP需要POST的XML

2021-03-07 2671点热度 0人点赞 0条评论

前言

在几年前,webservice流行了一阵子,所以当年有很多项目是基于webservice开发了接口,不过后来因为其比较复杂,被后来Json方式的Http的API接口取代了。不过还是有一些老的项目在用,今天就遇到了一个需求,需要调用webservice来对接数据。

现在再去研究webservice的技术就显得很不值得了,还要在新项目中增加相关的依赖(比如AXIS、wsdl4j等等),对项目的侵入性很大。所以想能否把WSDL的规则转成用Http的POST的方式的XML(因为它的本质最后也是通过HTTP来提交的)

实现

后来找到一个免费开源的软件,可以很简单的做这种转化,叫:SoupUI MacOS和Windows下都能安装

安装好后,新建一个SOAP Project

如上图,填写Project名字和WSDL地址(也可以通过Browse浏览wsdl文件),就可以生成需要POST的XML啦:如下:

好了,接下来我们把测试的XML写一个测试用OKHttp提交测试下(其他语言,或者用HttpUrlConnection也类似,总之就是把XML用Content-Type是application/xml POST到WSDL地址上去就好了):

public static void main(String[] args) throws Exception {
    String wsdl = "http://www.example.com/WS_Server/xxx";

    String string = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
            "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:my=\"http://my.server.ws.com/\">\n" +
            "   <soapenv:Header/>\n" +
            "   <soapenv:Body>\n" +
            "      <my:instruInfo>\n" +
            "         <insCode>abc</insCode>\n" +
            "         <instruType>4</instruType>\n" +
            "      </my:instruInfo>\n" +
            "   </soapenv:Body>\n" +
            "</soapenv:Envelope>";

    OkHttpClient client = new OkHttpClient().newBuilder().build();

    RequestBody requestBody = RequestBody.create(MediaType.parse("application/xop+xml; charset=UTF-8;"), string);

    Request request = new Request.Builder().url(wsdl).post(requestBody)
            .addHeader("Content-Type", "application/xop+xml; charset=UTF-8;")
            .addHeader("Content-Length", String.valueOf(string.length()))
            .build();
    Response response = client.newCall(request).execute();
    String body = response.body().string();
    System.out.println(body);

}

以上测试过Content-Type可能是如下几个(如遇到:服务器无法为请求提供服务,因为不支持该媒体类型):

text/xml; charset=UTF-8;

application/xop+xml; charset=UTF-8;

application/soap+xml; charset=utf-8;

admin

这个人很懒,什么都没留下

文章评论

您需要 登录 之后才可以评论