简单方式调用WebService服务

news2024/11/24 1:29:05

好久没有进行过WebService开发了,由于项目需要,重拾WebService,记录一下简单的服务调用方法。

拿到需求,仅半页word,其他的就没有了,为了快速开发,尝试过使用插件逆向生成调用的一大堆类,发现调用不通,又尝试了其他办法,结合资料,终于摸索出了下述办法。

  1. 下载WebServiceStudio.exe并安装

  1. 打开软件在WSDL EndPoint中输入服务提供者提供的Endpoint address,这个地址就是访问地址,当然也可能是其他形式的,输入后别忘了添加?wsdl,如http://IP:PORT/ServiceName/SyncAqiDataService?wsdl

接着点击GET,程序会自动解析请求,如果有账号密码会出现下边这种形式:

输入完后点击下边的Invoke,如下:

等待一下就会出现请求的结果:

以上说明对服务的请求没有问题,接下来就是编写了。

3.打开左上角的Request/Response标签,就是请求的一些内容,包含字符编码,请求地址、超时时间等,这部分在后续构造请求时会用到,右边是请求体,很容易发现是个xml的格式,为了方便起见,我们可以把这个请求封装成一个请求字符串,内部的参数直接拼接上去,是不是很容易?

  1. 上边的内容熟悉后,下边就是编码部分了,首先创建请求方法,调用类可自行封装,这里只提供方法:

 public static String sendSoapPost(String url, String xml) {
        HttpURLConnection conn = null;
        OutputStream out = null;
        String contentType = "text/xml; charset=utf-8";
        //注意转义
        String soapAction = "\"\"";
        String returnXml = "";
        try {
            conn = (HttpURLConnection) new URL(url).openConnection();
            //WebServiceStudio请求中拿过来
            conn.setRequestProperty("Content-Type", contentType);
            if (null != soapAction) {
                //WebServiceStudio请求中拿过来
                conn.setRequestProperty("SOAPAction", soapAction);
            }
            //WebServiceStudio请求中拿过来
            conn.setRequestMethod("POST");
            //WebServiceStudio请求中拿过来
            conn.setConnectTimeout(100000);
            conn.setDoOutput(true);
            conn.setDoInput(true);
            conn.connect();
            out = conn.getOutputStream();
            out.write(xml.getBytes("UTF-8"));
            out.flush();
            out.close();
            int code = conn.getResponseCode();
            String tempString = null;
            StringBuffer sb = new StringBuffer();
            BufferedReader bufferedReader = null;
            if (code == HTTP_OK) {
                bufferedReader = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));
            } else {
                bufferedReader = new BufferedReader(new InputStreamReader(conn.getErrorStream(), "UTF-8"));
            }
            while ((tempString = bufferedReader.readLine()) != null) {
                sb.append(tempString);
            }
            if (null != bufferedReader) {
                bufferedReader.close();
            }
            returnXml = sb.toString();
            conn.disconnect();
        } catch (Exception e) {
            e.printStackTrace();
        }
        log.info("######################报文解析为字符串:{}",returnXml);
        return returnXml;
    }
  1. 接下来创建请求(把它当成一个Pojo对象,里边的参数就是对对象赋值,虽然这样比喻是错的,但是很直观),需要注意标签中的命名空间和目标方法,尽量配置成可变的,增加灵活性:

public class SoapDataParam {
    public static String getXmlParam(String userName,String pwd,String nameSpace,String targetMethod){
        String xml = "<?xml version=\"1.0\" encoding=\"utf-16\"?>\n" +
                "<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\">\n" +
                "  <soap:Body>\n" +
                "    <"+targetMethod+" xmlns=\""+nameSpace+"\">\n" +
                "      <userName xmlns=\"\">"+userName+"</userName>\n" +
                "      <pwd xmlns=\"\">"+pwd+"</pwd>\n" +
                "    </"+targetMethod+">\n" +
                "  </soap:Body>\n" +
                "</soap:Envelope>";
        return xml;
    }
}
  1. 调用sendSoapPost(String url, String xml)方法,xml就是上边的getXmlParam(tring userName,String pwd,String nameSpace,String targetMethod)方法返回的xml字符串,url就是请求的目标地址。

  1. 发送请求查看结果:

不难看出,已经请求成功了,当然,对我们需要的数据来说,需要用SOAPEnvelope类和JSONObject类进行解析拿到我们需要的数据:

    public static JSONObject parseXmlStr(String xmlStr) {
        SOAPMessage msgs = formatSoapString(xmlStr);
        SOAPBody body = null;
        try {
            SOAPEnvelope envelope = msgs.getSOAPPart().getEnvelope();
            body = envelope.getBody();
        } catch (SOAPException e) {
            e.printStackTrace();
        }
        Iterator itr = body.getChildElements();
        JSONObject json = new JSONObject();
        json = GetDate(itr, json);
        log.info("######################字符串报文解析为JSONObject:{}",json.toString());
        return json;
    }

以上,就是完整解析报文的简单方法,你学废了吗?😂

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/158261.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AWVS安装与激活

AWVS安装与激活 1.AWVS简介 AWVS&#xff08;Acunetix Web Vulnerability Scanner&#xff09;是一款知名的网络漏洞扫描工具&#xff0c;通过网络爬虫测试网站安全&#xff0c;检测流行的Web应用攻击&#xff0c;如跨站脚本、sql 注入等。据统计&#xff0c;75% 的互联网攻击…

pmp备考全攻略

我这里分享一下我备考的经验&#xff0c;如何对大家有帮助也可以稍微给点支持&#xff0c;让更多人了解&#xff01; 一&#xff0c;我的pmp备考经验 1.一阶段&#xff1a;铺底&#xff0c;花费时间1.5周左右 主要是熟悉考试框架和内容&#xff0c;通过看网盘资料里的章节重…

vue3+ts实现自定义按钮导航

效果图 点击对应按钮&#xff0c;相应按钮被激活&#xff0c;背景平移至激活按钮&#xff0c;字体高亮&#xff0c;其余按钮重置&#xff0c;由于ele没有类似tab&#xff0c;就简单记录下。 实现 <template><div class"tab_wrapper"><spanv-for&q…

这些技巧你值得学会

技巧一&#xff1a;多图合并为PDF文件 处理合并多份PDF文件外&#xff0c;使用PS的【PDF演示文稿】工具&#xff0c;也能一同将多张图片合并成PDF文档&#xff01;通过合并的方式&#xff0c;不但能够批量归纳汇总图片&#xff0c;而且还能根据自身需求&#xff0c;将图片与PD…

Visual studio C++程序内使用Sqlite3

Visual studio C程序内使用Sqlite3 前言 本篇讲解了如何在Visual studio开发的C桌面应用程序内使用Sqlite数据库&#xff0c;Sqlite的语法和Mysql是一样的&#xff0c;所以本篇文章不对数据库语法做过多介绍&#xff0c;介绍一些常用Sqlite的API ★提高阅读体验★ &…

二叉树常见题目

目录 一、判断一棵树是否为另一棵树的子树 二、判断是否对称二叉树 三、翻转二叉树 四、二叉树构建及遍历 五、根据二叉树创建字符串 六、二叉树的最近公共祖先 七、根据前序遍历和中序遍历构造二叉树 八、根据后序遍历和中序遍历构造二叉树 九、二叉树前序非递归…

MySQL——“order by”是如何工作的

假设目前有这么一个表 CREATE TABLE t (id int(11) NOT NULL,city varchar(16) NOT NULL,name varchar(16) NOT NULL,age int(11) NOT NULL,addr varchar(128) DEFAULT NULL,PRIMARY KEY (id),KEY city (city) ) ENGINEInnoDB; 业务要求是要查询城市是“杭州”的所有人名字&a…

1.2计算机系统的层次结构

文章目录&#xff08;1&#xff09;微指令&#xff08;2&#xff09;汇编语言&#xff08;3&#xff09;高级语言&#xff08;4&#xff09;操作系统&#xff08;5&#xff09;编译程序与解释程序&#xff08;6&#xff09;总结请先食用这一篇 计算机工作过程&#xff08;1&…

考研《数据结构》线性表—顺序表练习题

2.设计一个高效算法&#xff0c;将顺序表L的所有元素逆置&#xff0c;要求算法的空间复杂度为0&#xff08;1&#xff09;。 思路&#xff1a;扫描顺序表L的前半部分元素&#xff0c;对于元素L.data[i]与L.data[len-1-i]对换。 #include<iostream> using namespace std…

XCTF:NewsCenter

一道简单的常规注入题&#xff0c;就当练练手了 尝试’ 直接网页异常&#xff0c;尝试进行闭合# 网页恢复正常&#xff0c;证明SQL语句通过单引号进行闭合&#xff0c;则为字符型注入 直接判断字段数&#xff0c;order by n order by 3#回显正常&#xff0c;order by 4#网页异…

kaggle平台学习复习笔记 | 数据划分与模型集成

目录数据集划分与交叉验证模型集成方法Titanic为例的简单应用kaggle比赛相关tips数据集划分与交叉验证 数据集划分 通常有两种方法&#xff1a; 留出法(Hold-out) 适用于数据量大的情况K折交叉验证(K-fold CV) 适用于数据量一般情况 时间比较长自助采样(Bootstrap) 较少使用 …

Lua C接口编程(二)

引言 上篇文章我们学习了C如何调用Lua&#xff0c;今天我们就来聊聊Lua 如何调用C。 Lua版本&#xff1a;Lua 5.3.5 对于Lua提供的接口有不清楚的&#xff0c;可以参考Lua接口官方文档 一、Lua调用C步骤 需要将C文件编译成动态库在Lua文件中使用package.cpath配置C动态库路…

Linux学习笔记——分布式内存计算Spark安装部署

5.12、分布式内存计算Spark环境部署 5.12.1、简介 Spark是一款分布式内存计算引擎&#xff0c;可以支撑海量数据的分布式计算。 Spark在大数据体系是明星产品&#xff0c;作为最新一代的总和计算引擎&#xff0c;支持离线计算和实时计算。 在大数据领域广泛应用&#xff0c…

虚拟化技术考试重点总结

虚拟化技术考试重点总结 什么是虚拟化&#xff1f;其作用是什么 ​ 虚拟化&#xff0c;是指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机。可以在一台计算机上同时运行多个逻辑计算机&#xff0c;每个逻辑计算机可运行不同的操作系统&#xff0c;并且应用程序都可以在相互…

Golang中http编程

http介绍 编写web语言&#xff1a; 1.java 2.php&#xff0c;现在都在尝试用go语言编写 3.python&#xff0c;豆瓣 4.go语言 》 beego&#xff0c;gin两个主流的web框架 https协议&#xff1a;我们使用浏览器访问的时候发送的就是http请求 http是应用层的协议&#xff0c;底…

论文投稿指南——中文核心期刊推荐(地质学)

【前言】 &#x1f680; 想发论文怎么办&#xff1f;手把手教你论文如何投稿&#xff01;那么&#xff0c;首先要搞懂投稿目标——论文期刊 &#x1f384; 在期刊论文的分布中&#xff0c;存在一种普遍现象&#xff1a;即对于某一特定的学科或专业来说&#xff0c;少数期刊所含…

广告业务系统 之 辅助决策 —— “ AB 实验平台”

文章目录广告业务系统 之 辅助决策 —— “ AB 实验平台”AB 实验平台流量侧 & 渲染侧AB 实验模块架构设计智能流控广告业务系统 之 辅助决策 —— “ AB 实验平台” AB 实验平台 在广告业务中&#xff0c;数据通常作为业务前进的内在驱动力之一。 AB 实验平台就是以实验…

java获取时间并进行计算

前言 SimpleDateFormat使用介绍 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、SimpleDateFormat是什么&#xff1f; 如果你对java源码比较了解。你会发现java对文字&#xff0c;数字的格式化&#xff0c;是有一个公共的父类的Format。 NumberFo…

.Net Core6.0程序发布到IIS支持apk文件下载

ASP.Net Core6.0 WebApi程序发布到IIS支持apk/wgt文件下载 IIS中配置MIME 添加.apk/.wgtapplication/vnd.android.package-archive或application/octet-stream.Net Core6.0 WebApi 程序要在startup.cs中设置 //使用默认文件 app.UseDefaultFiles(); //开启静态文件 app.UseS…

金山区企业工程技术研究中心给予15万元资金奖励

金山区企业工程技术研究中心一、主管部门金山区科学技术委员会二、政策依据《金山区关于进一步鼓励科技创新加快上海科技创新中心重要承载区建设的若干配套政策》&#xff08;金府发〔2020〕3号&#xff09;《金山区关于进一步鼓励科技创新加快上海科技创新中心重要承载区建设的…