加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

4.5Webservice

发布时间:2020-12-16 21:50:08 所属栏目:安全 来源:网络整理
导读:个人印象笔记 包括的内容: sope消息的方式即原始的方式 Http协议中,通过Soap协议来发送XML数据的消息格式 ?? ??????????????? 利用开源Commont-httpClient来模拟HTTP请求,发送XML的消息格式。 二进制文件在webservice中的处理。是在(webservice4.6的录频

个人印象笔记

包括的内容:
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("");
// 将消息发送到服务端,通过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);
? // 解析返回的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) {
//通过原始的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>
<artifactId>httpclient-cache</artifactId>
</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) {
private static void sendSoap() {
HttpPost httpPost = new HttpPost("http://localhost:4040/first?wsdl");
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 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();
} catch (Exception e) {

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:serverserver.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:clienttest.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:clienttest.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:serverjQuery1.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:clienttest.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);
}

}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读