java访问webService接口,获取头信息

一、访问webService接口

访问webservice方式:直接用http发送post请求

  • 拼接xml数据
private String getXML(String time, String sign, String name)  {

	String xml="\r\n" + 
			"   \r\n" + 
			"   \r\n" + 
			"       "+time+"\r\n" + 
			"       "+sign+"\r\n" + 
			"   \r\n" + 
			"   \r\n" + 
			"   \r\n" + 
			"      \r\n" + 
			"         "+name+"\r\n" + 
			"      \r\n" + 
			"   \r\n" + 
			"";
	return xml;
}
  • 发送请求,访问接口
@ResponseBody
@RequestMapping("/getRes")
public String getRes() {
   String url1 = "http://127.0.0.1:8011/demo/services/hello";
   StringBuilder sb = new StringBuilder();
   InputStream is = null;
   InputStreamReader isr = null;
   BufferedReader br = null;
   OutputStream os = null;
   try {
	   //第一步:创建服务地址
	   URL url = new URL(url1);
	   //打开链接
	   HttpURLConnection connection = (HttpURLConnection) url.openConnection();
	   //第三步:设置参数  
	   //3.1发送方式设置:POST必须大写  
	   connection.setRequestMethod("POST");  
	   //3.2设置数据格式:content-type  
	   connection.setRequestProperty("content-type", "text/xml;charset=utf-8");  
	   //3.3设置输入输出,因为默认新创建的connection没有读写权限,  
	   connection.setDoInput(true);  
	   connection.setDoOutput(true);
	   //第四步:组织SOAP数据,发送请求  
	   String time = "1568958856730";
	   String sign = "L69yyZXc6CwjXgpw5vE89AZFxTvGu6Rqr/62UbNFfHk=";
	   String name = "张生";
	   String soapXML = getXML(time,sign,name);
	   os = connection.getOutputStream();  
	   os.write(soapXML.getBytes()); 
	   //第五步:接收服务端响应,打印  
	   int responseCode = connection.getResponseCode();
	   if(responseCode==200){
		   is = connection.getInputStream();  
		   isr = new InputStreamReader(is);  
		   br = new BufferedReader(isr);  
		   sb = new StringBuilder();  
		   String temp = null;  
		   while(null != (temp = br.readLine())){  
			   sb.append(temp);  
		   }  
	   }else{
		   sb.append("调用失败");
		   System.out.println("调用服务失败,错误码:"+responseCode);
		   return sb.toString();
	   }
   } catch (Exception e) {
	   e.printStackTrace();
   }finally {
	  try {
		  is.close();  
		  isr.close();  
		  br.close();
		  os.close();
	  } catch (IOException e) {
		  e.printStackTrace();
	  }
   }
   return sb.toString();
}
  • 访问controller方法,成功获取响应数据

http://127.0.0.1:8011/demo/demo/getRes

张生您好!现在时间是:Fri Sep 20 15:34:21 CST 2019

二、获取请求信息

  • 编写拦截器
import java.util.Enumeration;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.cxf.binding.soap.SoapMessage;
import org.apache.cxf.headers.Header;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.message.Message;
import org.apache.cxf.phase.AbstractPhaseInterceptor;
import org.apache.cxf.phase.Phase;
import org.apache.cxf.phase.PhaseInterceptorChain;
import org.apache.cxf.transport.http.AbstractHTTPDestination;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
 
 
public class WebServiceInterceptor extends AbstractPhaseInterceptor {
 
    public WebServiceInterceptor() {
        super(Phase.PRE_INVOKE);
    }
    @Override
    public void handleMessage(SoapMessage soapMsg) throws Fault {
        
        Message msg = PhaseInterceptorChain.getCurrentMessage();
        HttpServletResponse response = (HttpServletResponse) msg.get(AbstractHTTPDestination.HTTP_RESPONSE);
        HttpServletRequest request = (HttpServletRequest) msg.get(AbstractHTTPDestination.HTTP_REQUEST);
        Enumeration headerNames = request.getHeaderNames();
        
        while (headerNames.hasMoreElements()) {
            String headerName = (String) headerNames.nextElement();
            String header = request.getHeader(headerName);
            System.out.println(headerName+":"+header);
        }
        
        System.out.println("===================================");
        
        List
headers = soapMsg.getHeaders();// 根据soap消息获取头部 for (Header header : headers) { Element ele = (Element) header.getObject(); NodeList nodeList = ele.getChildNodes(); for(int i = 0 ; i< nodeList.getLength();i++) { String textContent = nodeList.item(i).getTextContent(); String nodename = nodeList.item(i).getNodeName(); System.out.println("nodename:"+nodename+";textContent:"+textContent); } } } }
  • Endpoint中加入拦截器配置
//终端路径
@Bean
public Endpoint endpoint() {
	// 绑定要发布的服务
	EndpointImpl endpoint = new EndpointImpl(springBus(), getHelloWorld());
	endpoint.publish("/hello");
	endpoint.getInInterceptors().add(createCheckAuthInterceptor());  // 添加拦截器
	return endpoint;
}

@Bean
public Interceptor createCheckAuthInterceptor(){
	return new WebServiceInterceptor();
}

加上拦截器后访问接口,控制台打印信息如下:

content-type:text/xml;charset=utf-8
cache-control:no-cache
pragma:no-cache
user-agent:Java/1.8.0_181
host:127.0.0.1:8011
accept:text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
connection:keep-alive
content-length:651
===================================
       
nodename:auth_rtime;textContent:1568958856730
   
nodename:auth_sign;textContent:L69yyZXc6CwjXgpw5vE89AZFxTvGu6Rqr/62UbNFfHk=
       
nodename:name;textContent:张生

项目中遇到获取头信息的问题,做个记录。

你可能感兴趣的:(Java,学)