记录一个作为客户端,以Soap协议方式访问webservice接口服务端的工具类,也作为大家的一个参考。
import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.net.URL; import java.net.URLConnection; import java.util.Map; public class SOAPUtils { private static String getSoapRequest(String xmlPath, Map<String, String> params) { try { InputStreamReader isr = new InputStreamReader(new FileInputStream( new File(xmlPath)), "UTF-8"); BufferedReader reader = new BufferedReader(isr); String soap = ""; String tmp; while ((tmp = reader.readLine()) != null) { soap += tmp; } reader.close(); isr.close(); for (String paramName : params.keySet()) { String paramValue = params.get(paramName); soap = soap.replace(":" + paramName, paramValue); } return soap; } catch (Exception ex) { ex.printStackTrace(); return null; } } /** * * @param urlString * :webservice的url * @param SOAPAction * :调用的接口中的方法名 * @param xmlPath * :传入参数的xml文件路径 * @param params * :需要传入的动态配置的参数 * @return:返回一个可指定编码的IO * @throws Exception */ public static InputStreamReader getSoapInputStream(String urlString, String SOAPAction, String xmlPath, Map<String, String> params) throws Exception { try { String soap = getSoapRequest(xmlPath, params); if (soap == null) { return null; } URL url = new URL(urlString); URLConnection conn = url.openConnection(); conn.setUseCaches(false); conn.setDoInput(true); conn.setDoOutput(true); conn.setRequestProperty("Content-Length", Integer.toString(soap .length())); conn.setRequestProperty("Content-Type", "text/xml; charset=utf-8"); conn.setRequestProperty("SOAPAction", urlString + "/" + SOAPAction); OutputStream os = conn.getOutputStream(); OutputStreamWriter osw = new OutputStreamWriter(os, "utf-8"); osw.write(soap); osw.flush(); osw.close(); InputStream is = conn.getInputStream(); // 指定返回编码 InputStreamReader isr = new InputStreamReader(is, "UTF-8"); return isr; } catch (Exception e) { e.printStackTrace(); return null; } } /** * 将返回的IO转化为一个String返回 * * @param urlString * @param SOAPAction * @param xmlPath * @param params * @return * @throws Exception */ public static String getSoapResponse(String urlString, String SOAPAction, String xmlPath, Map<String, String> params) throws Exception { InputStreamReader isr = getSoapInputStream(urlString, SOAPAction, xmlPath, params); StringBuffer result = new StringBuffer(); int b = -1; while ((b = isr.read()) != -1) { result.append((char) b); } isr.close(); return result.toString(); } /** * xml文件中是一个soap协议形式的内容 * * @param xmlPath * @return */ public static String getDemoResponse(String xmlPath) { try { InputStreamReader isr = new InputStreamReader(new FileInputStream( new File(xmlPath)), "UTF-8"); BufferedReader reader = new BufferedReader(isr); String soap = ""; String tmp; while ((tmp = reader.readLine()) != null) { soap += tmp; } reader.close(); isr.close(); return soap; } catch (Exception ex) { ex.printStackTrace(); return null; } } }
在上述类中,getSoapInputStream方法中,请求参数(即传入的xml文件以及内容)需要指定编码格式(要与服务器要求的编码一致)。由于有时候作为访问客户端的机器默认编码有可能和接口服务器机器上的指定编码不一致,而导致结果文件或者结果IO都是默认采用客户端访问机的编码,从而产生乱码,所以返回xml结果的时候,最好也指定编码。