个人印象笔记 包括的内容: sope消息的方式即原始的方式 Http协议中,通过Soap协议来发送XML数据的消息格式 利用开源Commont-httpClient来模拟HTTP请求,发送XML的消息格式。 二进制文件在
个人印象笔记
包括的内容: sope消息的方式即原始的方式 Http协议中,通过Soap协议来发送XML数据的消息格式 利用开源Commont-httpClient来模拟HTTP请求,发送XML的消息格式。 二进制文件在webservice中的处理。是在(webservice4.6的录频中) 1.客户端发送消息时使用SOAP消息来发送。 可以看看这篇博客 http://sishuok.com/forum/blogPost/list/5703.html 1.1:SOAP消息的格式:1.2:soap消息的创建和传递。 客户端代码: package com.soap;
import java.io.IOException; import java.net.URL;
import javax.xml.namespace.QName; import javax.xml.soap.MessageFactory; import javax.xml.soap.SOAPBody; import javax.xml.soap.SOAPBodyElement; import javax.xml.soap.SOAPEnvelope; import javax.xml.soap.SOAPException; import javax.xml.soap.SOAPHeader; import javax.xml.soap.SOAPMessage; import javax.xml.soap.SOAPPart; import javax.xml.ws.Dispatch; import javax.xml.ws.Service;
import org.w3c.dom.Node; //客户端发送SOAP消息到服务端和接受服务端返回来的消息 public class TestSoap { public static void main(String[] args) { TestSoap.sendSoapMsg(); } private static void sendSoapMsg() { String nameSpace = "http://webservice.com/"; try { // 1:创建一个Soap的消息工厂 MessageFactory factory = MessageFactory.newInstance(); //2:创建一个soapMessage对象 SOAPMessage send_message = factory.createMessage(); SOAPPart soapPart = send_message.getSOAPPart(); // 获取head与Body对象 SOAPEnvelope envelope = soapPart.getEnvelope(); SOAPHeader header = envelope.getHeader(); SOAPBody body = envelope.getBody(); // 往Body中加入元素 // 根据Qname创建相应的节点,Qname是一个带有命名空间的节点 // 这里指定ns是前缀,必须指定,随便定义即可,不定义这消息将无效 // 这边的QName是用于调用方法。因为add是方法名 QName addName = new QName(nameSpace, "add", "ns"); SOAPBodyElement element = body.addBodyElement(addName); element.addChildElement(new QName("x")).setValue("11"); element.addChildElement(new QName("y")).setValue("22"); System.out.println("客户端发送的Soap消息"); //打印消息信息 send_message.writeTo(System.out);
System.out.println(""); System.out.println(""); System.out.println(""); System.out.println("");
// 将消息发送到服务端,通过Dispatch传递消息,会返回相应消息 URL wsdlDocumentLocation = new URL( "http://localhost:4040/first?wsdl"); //// 这边的Qname是用于创建服务,因此 FirstService 是WebService的服务名。 QName serviceName = new QName(nameSpace, "FirstService"); Service service = Service.create(wsdlDocumentLocation, serviceName); //这边的QName是用于创建调用的Port,因此 FirstPort是Webservice调用的端口。 QName portName = new QName(nameSpace, "FirstPort"); /** * Mode * * Mesage:发送是XML的Doucment对象 * * PlayLoad:发送的是XML的字符串 */ Dispatch<SOAPMessage> dispatch = service.createDispatch(portName, SOAPMessage.class, Service.Mode.MESSAGE); // 接消息发送出去,并且接收服务端返回的消息 SOAPMessage response_message = dispatch.invoke(send_message); System.out.println("接收返回的消息"); response_message.writeTo(System.out);
System.out.println(""); System.out.println("");
// 解析返回的Soap消息 SOAPEnvelope resp_Envelope = response_message.getSOAPPart() .getEnvelope(); SOAPBody resp_body = resp_Envelope.getBody(); System.out.println(resp_body); Node node = resp_body.getElementsByTagName("addResult").item(0); String addResult = node.getTextContent(); System.out.println("addResult = " + addResult); } catch (SOAPException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } //通过原始的Soap协议发送的消息,那么异常永远都只会是SoapFaultException 服务端代码:
package com.webservice;
import javax.jws.WebParam; import javax.jws.WebResult; import javax.jws.WebService;
@WebService public interface FirstService { @WebResult(name = "addResult") public int add(@WebParam(name = "x")int x, @WebParam(name = "y")int y); }
package com.webservice;
import javax.jws.WebService;
@WebService(endpointInterface = "com.webservice.FirstService") public class First implements FirstService {
public int add(int x, int y) { System.out.println("调用add方法"); return x + y; } }
2.HttpClient调用方式: 使用HttpClient发送请求、接收响应很简单,一般需要如下几步即可。 1. 创建HttpClient对象。使用 DefaultHttpClient来创建。
2. 创建请求方法的实例,并指定请求URL。如果需要发送GET请求,创建HttpGet对象;如果需要发送POST请求,创建HttpPost对象。
3. 如果需要发送请求参数,可调用HttpGet、HttpPost共同的setParams(HetpParams params)方法来添加请求参数;对于HttpPost对象而言,也可调用setEntity(HttpEntity entity)方法来设置请求参数。
4. 调用HttpClient对象的execute(HttpUriRequest request)发送请求,该方法返回一个HttpResponse。
5. 调用HttpResponse的getAllHeaders()、getHeaders(String name)等方法可获取服务器的响应头;调用HttpResponse的getEntity()方法可获取HttpEntity对象,该对象包装了服务器的响应内容。程序可通过该对象获取服务器的响应内容。 6.需要3个包: httpcilent-4.2.3.jar,httpcore-4.2.2.jar,httpclient-cache-4.2.3 可以用依赖: <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.2.3</version> </dependency><dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient-cache</artifactId> <version>4.2.3</version> </dependency> 服务端代码和上面的那个是一样的 客户端 客户端代码: package com.soap;
import java.io.IOException; import java.io.StringReader;
import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.util.EntityUtils; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.io.SAXReader; //客户端测试代码 public class TestHttpClient { public static void main(String[] args) { // TestHttpClient.get();
TestHttpClient.sendSoap(); }
private static void get() { DefaultHttpClient httpClient = new DefaultHttpClient(); HttpGet httpGet = new HttpGet("http://www.baidu.com");
try { HttpResponse response = httpClient.execute(httpGet);
HttpEntity entity = response.getEntity(); String str = EntityUtils.toString(entity);
System.out.println("str = " + str); } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }
}
private static void sendSoap() { DefaultHttpClient httpClient = new DefaultHttpClient(); HttpPost httpPost = new HttpPost("http://localhost:4040/first?wsdl");
try {
StringBuffer soapXML = new StringBuffer(); soapXML .append("<SOAP-ENV:Envelope xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\">"); soapXML.append("<SOAP-ENV:Header/>"); soapXML.append("<SOAP-ENV:Body>"); soapXML.append("<ns:add xmlns:ns=\"http://webservice.com/\">"); soapXML.append("<x>11</x>"); soapXML.append("<y>55</y>"); soapXML.append("</ns:add>");
soapXML.append("</SOAP-ENV:Body>"); soapXML.append("</SOAP-ENV:Envelope>");
StringEntity soapEntity = new StringEntity(soapXML.toString()); httpPost.setEntity(soapEntity); httpPost.setHeader("Content-Type", "text/xml; charset=UTF-8"); HttpResponse response = httpClient.execute(httpPost); HttpEntity entity = response.getEntity(); /** * soapr返回的是java.dom.Document对象。 * * httpClient返回的是String对象。将String转换为XML中的Document这个对象。 */ String str = EntityUtils.toString(entity);
System.out.println("str = " + str);
String addResult = str.substring(str.indexOf("<addResult>") + 11, str.indexOf("</addResult>")); System.out.println("addResult = " + addResult); /** * 解析XML的字符串,转为XML的Document对象 */ /** * 解析XML的步骤 * * 1:创建一个XML的解析器 * * 2:解析器解析XML文件,返回一个Document对象。 * * 3:通过Doucment就可以获取XML的根节点 * * 4:获取根节点下的子节点。 */ SAXReader reader = new SAXReader(); Document document = reader.read(new StringReader(str)); Element rootElement = document.getRootElement(); System.out.println(rootElement.getName());
Element resultElement = rootElement.element("Body").element( "addResponse").element("addResult"); addResult = resultElement.getText(); System.out.println("addResult = " + addResult); } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); }
} }
3:webservice互传文件: 二进制文件在webservice中的处理。 A:通过byte[]字节数组的方式来传递。比较适合小文件,字节数组不能太大的情况。 B:通过DataHander的方式来进行传递。 1:接口中要定义@MTOM 2:方法中要使用@XmlMimeType(value = "application/octet-stream") A方式: 服务端代码:
package com.webservice;
import javax.jws.WebParam; import javax.jws.WebResult; import javax.jws.WebService; //接口类 @WebService public interface IFileService { @WebResult(name = "addResult") public byte [] sendImageToClient(); public void receiveClientImage(@WebParam(name = "bytes")byte [] bytes, @WebParam(name = "filename")String filename); }
package com.webservice;
import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream;
import javax.jws.WebService;
import org.apache.commons.io.IOUtils;
import sun.nio.ch.IOUtil; @WebService(endpointInterface="com.webservice.IFileService") public class FileImpl implements IFileService{
@Override public byte[] sendImageToClient() { File file = new File("E:\\server\\server.PNG"); byte [] buffer = null; FileInputStream fileInputStream = null; try { fileInputStream = new FileInputStream(file); buffer = IOUtils.toByteArray(fileInputStream); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally{ IOUtils.closeQuietly(fileInputStream); } return buffer; }
@Override public void receiveClientImage(byte[] bytes, String filename) { if (bytes != null && bytes.length> 0) { OutputStream outputStream = null;; try { outputStream = new FileOutputStream("E:\\server\\" + filename + ""); IOUtils.write(bytes, outputStream); } catch (FileNotFoundException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally{ IOUtils.closeQuietly(outputStream); }
}
}
}
客户端代码:
package sss.file;
import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException;
import org.apache.commons.io.IOUtils; //客户端测试代码 public class TestMain { public static void main(String[] args) { //TestMain.one();
TestMain.two(); }
private static void one() { IFileService iFileService = new FileImplService().getFileImplPort(); byte [] bytes = iFileService.sendImageToClient(); FileOutputStream fileOutputStream = null; try { fileOutputStream = new FileOutputStream("E:\\client\\test.jpg"); IOUtils.write(bytes, fileOutputStream); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ IOUtils.closeQuietly(fileOutputStream); } } private static void two() { IFileService iFileService = new FileImplService().getFileImplPort(); File file = new File("E:\\client\\test.jpg"); byte [] buffer = null;
FileInputStream fileInputStream = null; try { fileInputStream = new FileInputStream(file); buffer=IOUtils.toByteArray(fileInputStream); iFileService.receiveClientImage(buffer, "hahah.PNG"); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally{ IOUtils.closeQuietly(fileInputStream); }
}
}
注意: 输入输出流都要记得关闭,不然数据一直在代码中,这样在本地文件中查看不了。 要用这个类 IOUtils,得导 commons-io-2.2.jar包 <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.2</version> </dependency>
B方式: 服务端接口代码:
package com.webservice; import javax.activation.DataHandler; import javax.jws.WebParam; import javax.jws.WebResult; import javax.jws.WebService; import javax.xml.bind.annotation.XmlMimeType; import javax.xml.ws.soap.MTOM;
/** * 设置AttachementPart中MIME的功能 * * 1:在接口中开启@MTOM注解。 * * 2:在方法中加上@XmlMimeType(value = "application/octet-stream") * */ @WebService @MTOM public interface IFileDataHandler { @WebResult(name = "sendServerImageResult") @XmlMimeType(value = "application/octet-stream") public DataHandler sendServerImage();
public void receiveClientImage(@WebParam(name = "dataHandler") @XmlMimeType(value = "application/octet-stream") DataHandler dataHandler, @WebParam(name = "filename") String filename); }
服务端接口实现类代码:
package com.webservice; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream;
import javax.activation.DataHandler; import javax.activation.DataSource; import javax.activation.FileDataSource; import javax.jws.WebService;
import org.apache.commons.io.IOUtils;
@WebService(endpointInterface = "com.webservice.IFileDataHandler") public class SendFileDataHandler implements IFileDataHandler { public DataHandler sendServerImage() { File file = new File("E:\\server\\jQuery1.4 API-20100204.chm"); DataSource dataSource = new FileDataSource(file); DataHandler dataHandler = new DataHandler(dataSource); return dataHandler; } public void receiveClientImage(DataHandler dataHandler, String filename) { OutputStream outputStream = null; try { outputStream = new FileOutputStream("E:\\server\\" + filename + ""); dataHandler.writeTo(outputStream); } catch (IOException e) { e.printStackTrace(); } finally { IOUtils.closeQuietly(outputStream); } } }
客户端测试类代码:
package com.file_handler; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException;
import javax.activation.DataHandler; import javax.activation.DataSource; import javax.activation.FileDataSource;
public class TestMain { public static void main(String[] args) { //TestMain.getServerFile();
TestMain.sendClientFile(); } /** * 接收服务端发送的文件 */ private static void getServerFile() { IFileDataHandler dataService = new SendFileDataHandlerService() .getSendFileDataHandlerPort(); DataHandler dataHandler = dataService.sendServerImage(); try { dataHandler.writeTo(new FileOutputStream("E:\\client\\test.chm")); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }
private static void sendClientFile() { IFileDataHandler dataService = new SendFileDataHandlerService() .getSendFileDataHandlerPort(); String filename = "Storm.zip"; DataSource dataSource = new FileDataSource(new File("E:\\client\\" + filename + "")); DataHandler dataHandler = new DataHandler(dataSource); dataService.receiveClientImage(dataHandler, filename); }
}