WebServicesoap报⽂请求与响应报⽂解析
需求
今⽇公司要做⼀个协同办公系统(OA),PC端已经完成。现在要做⼀个⼿机端⽹页端的。从登陆⼊⼿,需要向 服务端发送⼀段请求报⽂获取响应报⽂,对响应报⽂进⾏解析判断是否登录成功。
当然⼿机客户端发送请求就不说了,就是普通的web请求。以下重点来讲怎么发送Soap请求报⽂来获取响应报⽂你该进⾏解析。话说多不如上代码。代码中有必要的注释。
资料
这是接⼝信息,描述了输⼊输出参数特征
这是需要发送的请求报⽂和服务地址,还有需要我们接收的响应报⽂。
当然,localhost:8080/v6sp2/WorkflowCommonService?xsd=1这个服务地址前部分是⾃⼰项⽬的地址,是要变得。
这就是所有资料信息。
解决⽅案
思路:⽤HttpClinet 来获取响应报⽂,document⽂档解析响应报⽂
为了结构明确,层次分明,我将冗长的⽅法封装在了多个⽅法中,在主⽅法中体现功能调⽤顺序,这样思路更清晰些。⼤家可以看主⽅法的中的调⽤顺序进⾏学习。调⽤⽅法出⽤红⾊字体标注.思路由黄⾊底⾊标注。
public static void main(String[] args) {
StringBuilder soap=new StringBuilder(); //构造请求报⽂
soap.append(" <soapenv:Envelope xmlns:soapenv=\"/soap/envelope/\" ");
soap.append(" xmlns:wor=\"www.horizon/workflow/webservice/client/workflowCommon\">");
soap.append(" <soapenv:Header>");
soap.append(" <HZWFService xmlns=\"www.huizhengtech/webservice/workflow\"");
soap.append(" xmlns:SOAP-ENV=\"/soap/envelope/\"");
soap.append(" SOAP-ENV:actor=\"/2003/05/soap-envelope/role/next\">admin&admin</HZWFService>");
soap.append(" </soapenv:Header>");
soap.append(" <soapenv:Body>");
soap.append(" <wor:sysLogin>");
soap.append(" <loginName>loginname</loginName >");
soap.append(" <password>password</password>");
soap.append(" <dbidentifier>system</dbidentifier>");
soap.append(" </wor:sysLogin>");
soap.append(" </soapenv:Body>");
soap.append(" </soapenv:Envelope>");
调用webservice服务String String();
String serviceAddress="IP:Port/WorkflowCommonService?wsdl"; //服务地址(将XXXX替换成⾃⼰项⽬的地址)
String charSet="utf-8";
String contentType="text/xml; charset=utf-8";
<span >//第⼀步:调⽤⽅法getResponseSoap。返回响应报⽂和状态码</span>
Map<String,Object> ResponseSoap(requestSoap, serviceAddress, charSet, contentType); Integer statusCode=(("statusCode");
if(statusCode==200){
String responseSoap=(("responseSoap");
String targetNodeName="isSuccess";
<span > //第⼆步:调⽤strXmlToDocument⽅法。
将字符串类型的XML的响应报⽂转化成Docunent结构⽂档</span>
Document doc=XMLUtil.strXmlToDocument(responseSoap);
<span > //第三步:调⽤getValueByElementName⽅法。递归获得⽬标节点的
值</span>
String result= ValueByElementName(doc,targetNodeName);
if(!StringUtils.isEmpty(result)){
System.out.println(result);
}
else{
System.out.println("没有此节点或者没有值!");}
}
else{
System.out.println("请求失败!");
}
}
⼯具类 SoapUtil.class 。
* <p>Description: 根据请求报⽂,请求服务地址获取响应报⽂
* @param requestSoap 请求报⽂
* @param serviceAddress 响应报⽂
* @param charSet 字符集
* @param contentType 类型
* @return map封装的服务器响应参数和返回报⽂.PS:statusCode :200正常响应。responseSoap:响应报⽂
* <p>thinking: </p>
*
* @author huoge
*</span>
public static Map<String,Object> responseSoap(String requestSoap,String serviceAddress,String charSet, String contentType){ String responseSoap="";
Map<String,Object> resultmap=new HashMap<String,Object>();
PostMethod postMethod = new PostMethod(serviceAddress);
byte[] b = new byte[0];
try {
b = Bytes(charSet);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
InputStream is = new ByteArrayInputStream(b, 0, b.length);
RequestEntity re = new InputStreamRequestEntity(is, b.length, contentType);
postMethod.setRequestEntity(re);
HttpClient httpClient = new HttpClient();
int statusCode = 0;
try {
statusCode = uteMethod(postMethod);
resultmap.put("statusCode", statusCode);
} catch (IOException e) {
throw new RuntimeException("执⾏http请求失败", e);
}
if (statusCode == 200) {
try {
responseSoap = ResponseBodyAsString();
resultmap.put("responseSoap", responseSoap);
} catch (IOException e) {
throw new RuntimeException("获取请求返回报⽂失败", e);
}
} else {
throw new RuntimeException("请求失败:" + statusCode);
}
return resultmap;
}
⼯具类 XMLUtil.class
* <p>Description:将字符串类型的XML 转化成Docunent⽂档结构</p>
* @param parseStrXml 待转换的xml 字符串
* @return Document
*
* @author huoge
*/
public static Document strXmlToDocument(String parseStrXml){
StringReader read = new StringReader(parseStrXml);
//创建新的输⼊源SAX 解析器将使⽤ InputSource 对象来确定如何读取 XML 输⼊
InputSource source = new InputSource(read);
/
/创建⼀个新的SAXBuilder
SAXBuilder sb = new SAXBuilder(); // 新建⽴构造器
Document doc = null;
try {
doc = sb.build(source);
} catch (JDOMException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return doc;
}
/**
* <p>Description: 根据⽬标节点名获取值</p>
* @param doc ⽂档结构
* @param finalNodeName 最终节点名
* @return
*
* @author huoge
*/
public static String getValueByElementName(Document doc,String finalNodeName){
Element root = RootElement();
HashMap<String,Object> map=new HashMap<String,Object>();
<span > //调⽤getChildAllText⽅法。获取⽬标⼦节点的值 </span> Map<String,Object> resultmap=getChildAllText(doc, root,map);
String result=((finalNodeName);
return result;
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论