使用http来调用webservice协议
使用http请求来调用webservice协议,首先是要先拼接soap格式的请求报文
拼接soap请求报文
public String jsonToXml(JsonObject json){
/**
*其中attributes是一个入参的数组,里面的元素为name和value
*name和userid也是入参
*/
logger.info("开始拼接请求报文");
//开始拼接请求报文
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\""+
"xmlns:ask=\"http://www.eastrobot.cn/ws/AskService\">\n");
stringBuilder.append("<soapenv:Header/>\n");
stringBuilder.append("<soapenv:Body>\n");
stringBuilder.append("<request>\n");
//如果出现数组,那么就给它遍历出来
for (int i = 0;i<attributes.size();i++){
JsonObject key = attributes.get(i).getAsJsonObject();
stringBuilder.append("<attributes>\n");
stringBuilder.append("<name>"+key.get("name").getAsString()+"</name>\n");
stringBuilder.append("<value>"+key.get("value").getAsString()+"</value>\n");
stringBuilder.append("</attributes>\n");
}
stringBuilder.append("<question>"+name+"</question>\n");
stringBuilder.append("<userId>"+userId+"</userId>\n");
stringBuilder.append("</request>\n");
stringBuilder.append("</soapenv:Body>\n");
stringBuilder.append("</soapenv:Envelope>");
return stringBuilder.toString();
}
拼接完soap报文后,就开发送http请求了
发送http请求
//请求路径
public static String wsdlURL = "http://127.0.0.1:/8080/kService?wsdl";
/**
* 发送http请求
* @param xml soap的请求报文
* @return
* @throws Exception
*/
public String sendHttp(String xml) throws Exception {
String s = "";
//创建HttpClientBuilder
logger.info("创建http连接");
HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();
CloseableHttpClient build = httpClientBuilder.build();
HttpPost httpPost = new HttpPost(wsdlURL);
try {
httpPost.setHeader("Context-Type", "text/xml;charset=utf-8");
StringEntity data = new StringEntity(xml, Charset.forName("UTF-8"));
httpPost.setEntity(data);
CloseableHttpResponse response = build.execute(httpPost);
HttpEntity httpEntity = response.getEntity();
if (httpEntity != null) {
s = EntityUtils.toString(httpEntity, "UTF-8");
}
} catch (IOException e) {
e.printStackTrace();
logger.info("读取soap请求报文异常");
} catch (ParseException e) {
e.printStackTrace();
} finally {
if (build != null) {
build.close();
}
}
return s;
}
发送完http请求报文,成功了,会返回一个响应报文,到此就结束了,但是有的需求会要将响应报文解析出来,我这边也将解析的响应报文的工具类给出来,我用的JsonObject是Gson
解析响应报文,将响应报文转为json
我用的是迭代器进行和do4j进行解析的
/**
* 将xml转为json
* @param xml 响应报文
* @return
* @throws Exception
*/
public JsonObject xmlToJson(String xml) throws Exception{
//创建jsonobject
JsonObject object = new JsonObject();
//创建JsonArray
JsonArray array = new JsonArray();
//将array添加到object中
object.add("data",array);
//创建一个SAXReader阅读器
SAXReader reader = new SAXReader();
// String xml = httpUtil.sendHttp(xiaoi);
//根据字符串构建字节数组输入流
InputStream is = new ByteArrayInputStream(xml.getBytes());
//用阅读器读取文档对象
Document document = reader.read(is);
//获取文档对象的根节点
logger.info("开始解析soap报文");
Element root = document.getRootElement();
//遍历子节点
for (Iterator iterator = root.elementIterator(); iterator.hasNext(); ) {
Element bodyElement = (Element) iterator.next();
for (Iterator iterator1 = bodyElement.elementIterator(); iterator1.hasNext(); ) {
Element responseElement = (Element) iterator1.next();
for (Iterator iterator3 = responseElement.elementIterator(); iterator3.hasNext(); ) {
Element element = (Element) iterator3.next();
String name = element.getName();
if ("data".equals(name)) {
// System.out.println(name + ":");
JsonObject ele = new JsonObject();
array.add(ele);
for (Iterator iterator4 = element.elementIterator(); iterator4.hasNext(); ) {
Element subElement = (Element) iterator4.next();
ele.addProperty(subElement.getName(), subElement.getStringValue());
// System.out.println(subElement.getName() + ":" + subElement.getStringValue());
}
} else {
object.addProperty(name, element.getStringValue());
// System.out.println(name + ":" + element.getStringValue());
}
}
}
}
return object;
}
其中代码可能有些问题,有些地方我做了一定的修改,整体的思路就是这样的