远方蔚蓝
一刹那情真,相逢不如不见

文章数量 126

访问次数 199887

运行天数 1437

最近活跃 2024-10-04 23:36:48

进入后台管理系统

HttpURLConnection调用Webservice接口


import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
 * Req_Mode_WebService 请求模式
 * 
 * @author wst(shi-tao.wen) 2021913日 上午10:20:43
 *
 */
public class ReqModeWebService {
	public static boolean test = false;
	private Logger logger = LoggerFactory.getLogger(this.getClass());
	public ReqModeWebService() {
	}
	/**
	 * WebService服务请求
	 * 
	 * @author wst(shi-tao.wen) 202193日 上午10:57:28
	 * @param apiParam
	 * @return
	 */
	public GeneralApiResult WebServiceFun(GeneralApiParamInfo apiParam) {
		logger.info("WebServiceFun --> ");
		GeneralApiResult result = new GeneralApiResult();
		HttpURLConnection connect = null;
		DataOutputStream out = null;
		BufferedReader bufferedReader = null;
		try {
			URL url = new URL(apiParam.getActualServerUrl());
			connect = (HttpURLConnection) url.openConnection();
			connect.setDoOutput(true);
			connect.setDoInput(true);
			connect.setRequestMethod("POST");
			connect.setRequestProperty("SOAPAction", apiParam.getNamepace() + apiParam.getActualInteface());
			connect.setRequestProperty("Content-Type", "text/xml; charset=UTF-8");
			connect.setRequestProperty("content-length", apiParam.getParams().toString().getBytes("UTF-8").length + "");
			out = new DataOutputStream(connect.getOutputStream());
			out.write(getXML(apiParam.getActualInteface(), apiParam.getParams().toString()).getBytes("UTF-8"));
			out.flush();
			out.close();
			int code = connect.getResponseCode();
			String tempString = null;
			StringBuffer sb = new StringBuffer();
			if (code == HttpURLConnection.HTTP_OK) {
				bufferedReader = new BufferedReader(new InputStreamReader(connect.getInputStream(), "UTF-8"));
			} else {
				bufferedReader = new BufferedReader(new InputStreamReader(connect.getErrorStream(), "UTF-8"));
			}
			while ((tempString = bufferedReader.readLine()) != null) {
				sb.append(tempString);
			}
			if (null != bufferedReader) {
				bufferedReader.close();
			}
			// 响应报文
			String websn = sb.toString();
			connect.disconnect();
			if (GeneralStringUtils.isBlank(websn)) {
				result.setMsg("接口请求异常,返回信息为空");
				result.setCode(500);
				result.setData("接口请求异常,返回信息为空");
			} else {
				String start = "<" + apiParam.getActualInteface() + "Return>";
				String end = "</" + apiParam.getActualInteface() + "Return>";
				String responseXml = websn.substring(websn.indexOf(start) + start.length(), websn.lastIndexOf(end)).replaceAll("& lt;", "<").replaceAll("& gt;", ">");
				result.setMsg("接口请求成功");
				result.setCode(200);
				result.setData(decodeUnicode(responseXml));
			}
		} catch (Exception e) {
			result.setCode(500);
			result.setData("");
			result.setMsg("系统请求异常,请求超时或业务异常,请稍后再试" + (e.getMessage() == null ? "" : ("," + e.getMessage())));
			logger.info(result.getMsg());
			if (e.getCause() != null && e.getCause().toString().toLowerCase().contains("time")
					&& e.getCause().toString().toLowerCase().contains("out")) {
			}
			e.printStackTrace();
		} finally {
			if (out != null) {
				try {
					out.close();
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
			if (bufferedReader != null) {
				try {
					bufferedReader.close();
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
			if (connect != null) {
				try {
					connect.disconnect();
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}
		return result;
	}
	public static void main(String[] args) {
		String xml = "<操作*>取认证相片</操作*><用户名*>99999</用户名*><密码*>99999</密码*>";
		GeneralApiParamInfo apiParam = new GeneralApiParamInfo();
		apiParam.setParams(getXML("allDsjk", xml));
		apiParam.setActualServerUrl("http://*.*.*.*/Service?wsdl");
		apiParam.setActualInteface("allDsjk");
		apiParam.setNamepace("http://***.wei.com/");
		GeneralApiResult result = new ReqModeWebService().WebServiceFun(apiParam);
		System.out.println(decodeUnicode(result.getData().toString()));
	}
	// 构建soap报文结构体
	public static String getXML(String fun, String message) {
		String xml = message.replaceAll("<", "& lt;").replaceAll(">", "& gt;"); // 接口约定传入xml报文,XML报文需转码; 
		String soapXML = 
				"<?xml version=\"1.0\" encoding=\"utf-16\"?>"
				+ "<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\">"
				+ "<soap:Body>" 
				+ "<" + fun + " xmlns=\"http://server.wei.com\">" 
				+ "<xml>" + xml + "</xml>" // 这里的内容根据相对应的接口修改,如接口约定传xml报文,且需要<xml>包含
				+ "</" + fun + ">" + "</soap:Body>" 
				+ "</soap:Envelope>";
		return soapXML;
	}
	/**
	 * &#x转码
	 * @author wst 20221020日 下午4:27:05
	 * @param sourceString
	 * @return
	 */
	public static String decodeUnicode(String sourceString) {
		// 定义正则表达式来搜索中文字符的转义符号  
        Pattern compile = Pattern.compile("&#.*?;");  
        // 测试用中文字符  
        Matcher matcher = compile.matcher(sourceString);  
        // 循环搜索 并转换 替换  
        while (matcher.find()) {  
            String group = matcher.group();  
            // 获得16进制的码  
            String hexcode = "0" + group.replaceAll("(&#|;)", "");  
            // 字符串形式的16进制码转成int并转成char 并替换到源串中  
            sourceString = sourceString.replaceAll(group, (char) Integer.decode(hexcode).intValue() + "");  
        }  
		return sourceString;  
	}
}
public class GeneralApiParamInfo {
	/**
	 * 接口编码
	 */
	private String apiCode;
	
	/**
	 * 接口平台地址
	 */
	private String apiUrl;
	
	/**
	 * 实际的接口名
	 */
	private String actualInteface;
	
	/**
	 * 实际的服务地址
	 */
	private String actualServerUrl;
	/**
	 * 参数
	 */
	private Object params;
	
	/**
	 * 传入参数名称
	 */
	private String[] paramsName;
	
	/**
	 * webservice名称空间
	 */
	private String namepace;
	
	/**
	 * SOAPAction
	 */
	private String SOAPAction;
	
	private boolean useApiPlatform = true;
	public GeneralApiParamInfo() {
		super();
	}
	public GeneralApiParamInfo(String apiCode, Object params) {
		super();
		this.apiCode = apiCode;
		this.params = params;
	}
	public String getApiCode() {
		return apiCode;
	}
	public void setApiCode(String apiCode) {
		this.apiCode = apiCode;
	}
	public Object getParams() {
		return params;
	}
	public void setParams(Object params) {
		this.params = params;
	}
	public String getActualInteface() {
		return actualInteface;
	}
	public void setActualInteface(String actualInteface) {
		this.actualInteface = actualInteface;
	}
	public String getActualServerUrl() {
		return actualServerUrl;
	}
	public void setActualServerUrl(String actualServerUrl) {
		this.actualServerUrl = actualServerUrl;
	}
	public String getApiUrl() {
		return apiUrl;
	}
	public void setApiUrl(String apiUrl) {
		this.apiUrl = apiUrl;
	}
	public boolean isUseApiPlatform() {
		return useApiPlatform;
	}
	public void setUseApiPlatform(boolean useApiPlatform) {
		this.useApiPlatform = useApiPlatform;
	}
	public String getNamepace() {
		return namepace;
	}
	public void setNamepace(String namepace) {
		this.namepace = namepace;
	}
	public String getSOAPAction() {
		return SOAPAction;
	}
	public void setSOAPAction(String sOAPAction) {
		SOAPAction = sOAPAction;
	}
	public String[] getParamsName() {
		return paramsName;
	}
	public void setParamsName(String[] paramsName) {
		this.paramsName = paramsName;
	}
}
public class GeneralApiResult {
	/**
	 * 响应码 200 成功; 400 接口不存在; 500 接口调用异常
	 */
	private Integer code;
	/**
	 * 异常信息
	 */
	private String msg;
	/**
	 * 返回数据
	 */
	private Object data;
	/**
	 * 返回经转换器转换后的参数
	 */
	private Object transParam;
	public Integer getCode() {
		return code;
	}
	public void setCode(Integer code) {
		this.code = code;
	}
	public String getMsg() {
		return msg;
	}
	public void setMsg(String msg) {
		this.msg = msg;
	}
	public Object getData() {
		return data;
	}
	public void setData(Object data) {
		this.data = data;
	}
	public Object getTransParam() {
		return transParam;
	}
	public void setTransParam(Object transParam) {
		this.transParam = transParam;
	}
	@Override
	public String toString() {
		return "{\"code\" : \"" + code + "\", \"msg\" : \"" + msg + "\", \"data\" : \"" + data
				+ "\", \"transParam\" : \"" + transParam + "\"}";
	}
}