`

HttpURLConnection发送实体数据到服务端

阅读更多

使用场景:

    客户端需要将实体数据同步到平台库,这里采用的是HTTP的形式,以下用户数据同步到平台库为例

1.需要导入xstream.jar

2.定义请求和响应的父类实体数据,方便后续编码

/**
 * 请求响应的父类对象
 */
public class Generic
{
	public Header header;
}

 

3.定义消息头实体,用于存放请求的操作类型编码和响应类型状态码

/**
 * 定义请求和响应头实体属性
 */
public class Header
{
	/** 数据操作类型编码 */
	public String reqCode;
	/** 数据响应类型编码 */
	public String respCode;
}

 

4.定义用户数据请求对象,这里需要使用到xstream的注解

 

/**
 * 请求实体对象定义
 */
@XStreamAlias("Request")
public class ReqUser extends Generic
{
	/** 定义具体是请求数据 */
	public ReqDataByUser data;
}

6.定义用户数据响应对象,这里需要使用到xstream的注解 

 

/**
 * 响应实体对象定义
 */
@XStreamAlias("Response")
public class RespUser extends Generic
{
	/** 定义具体是响应数据 */
	public RespDataByUser data;
}

 

7.创建将实体对象转换为请求或响应的xml文件

 

public static <T extends Generic> String packReqObject(T reqObj){
		
	XStream stream = new XStream(new DomDriver("utf-8"));
	stream.processAnnotations(reqObj.getClass());
	String xml = stream.toXML(reqObj);
	xml = XMLDECLARE + xml;
	
	return xml;
}

 

8.创建将请求或响应的xml文件转换为实体对象

public static <T extends Generic> T unpackReqObject(String reqXml, Class<T> clazz){
		
	XStream stream = new XStream(new DomDriver("utf-8"));
	stream.processAnnotations(clazz);
	return (T) stream.fromXML(reqXml);
}

 9.创建请求前的数据组装

public void send() throws Exception{
		
	ReqUser reqUser = new ReqUser();
	reqUser.header = new Header();
	reqUser.header.reqCode = "1001";
	
	reqUser.data = new ReqDataByUser();
	
	String xml = MsgUtil.packReqObject(reqUser);
	String responseStr = CommonService.postData("http://127.0.0.1:8080/user", xml);
	RespUser respUser = MsgUtil.unpackReqObject(responseStr, RespUser.class);
}

 

10.创建发送请求和接收响应消息类

public static String postData(String url, String str) throws Exception{
		
	URL myUrl = new URL(url);
	HttpURLConnection con = (HttpURLConnection)myUrl.openConnection();
	con.setDoInput(true);
	con.setDoOutput(true);
	con.setRequestMethod("POST");
	con.setUseCaches(false);
	con.setInstanceFollowRedirects(true);
	con.setRequestProperty("Content-Type", "text/plain");
	con.setRequestProperty("charset", "utf-8");
	con.connect();
	
	DataOutputStream out = new DataOutputStream(con.getOutputStream());
	out.flush();
	out.close();
	
	StringBuilder sb = new StringBuilder();
	BufferedReader br = null;
	try{
		br = new BufferedReader(new InputStreamReader(con.getInputStream()));
		String aLine = null;
		while((aLine = br.readLine()) != null){
			
			sb.append(aLine);
		}
	}catch(Exception e){
		
	}finally{
		br.close();
	}
	con.disconnect();
	
	return sb.toString();
}

 以上代码主要功能为客户端像服务端发送数据请求的功能

 

下列为服务端处理客户端发送请求的代码

 

1.将请求的流转换为xml字符串

/**
 * 将请求流中的数据转换为字符串
 */
public static String converRequestData(InputStream in) throws Exception{
	
	StringBuilder sb = new StringBuilder();
	BufferedReader br = null;
	try{
		br = new BufferedReader(new InputStreamReader(in));
		String aLine = null;
		while((aLine = br.readLine()) != null){
			
			sb.append(aLine);
		}
	}catch(Exception e){
		
	}finally{
		br.close();
	}
	
	return sb.toString();
}

 

2.根据请求的消息头Header中定义的reqCode,映射对应的实体对象

private static Map<String, String> getStubMap(){
		
	Map<String, String> stubMap = new HashMap<String, String>();
	stubMap.put("1001", "org.pojo.user.request.ReqDataByUser");
	
	return stubMap;
}

 

3.根据传入的属性查找xml文件节点的值

 

private String getNodeValue(String xml, String aTag){
		
	String ret = "";
	int startIndex = xml.indexOf("<" + aTag.trim() + ">");
	int endIndex = xml.indexOf("</" + aTag.trim() + ">");
	if((startIndex >= 0) && (endIndex >= 0) && (startIndex + aTag.length() + 2 < endIndex)){
		ret = xml.substring(startIndex + aTag.length() + 2, endIndex).trim();
	}
	
	return ret;
}

 

String reqXml = converRequestData(request.getInputStream());
		// 获取Head
		String headerValue = getNodeValue(reqXml, "Head");
		// 获取请求的类型编码
		String reqCode = getNodeValue(headerValue, "reqCode");
		
		Class clazz = null;
		// 判断当前的类型编码如果在Map中则实例化他,并返回
		if(getStubMap().containsKey(reqCode)){
			
			String classPath = getStubMap().get(reqCode);
			clazz = Class.forName(classPath);
		}
		
		// 将请求的xml文件转换为对应的实体对象
		Generic generic = MsgUtil.unpackReqObject(reqXml, clazz);
		
		//....... 这里写具体的代码处理,将generic对象传入
		
		// 请求完成后响应数据处理
		response.setContentType("text/plain");
		response.setCharacterEncoding("utf-8");
		
		// 将结果通过打包发送到客户端
		String respXml = MsgUtil.packReqObject(generic);
		byte[] sendBytes = respXml.getBytes("utf-8");
		response.getWriter().println(new String(sendBytes));
		response.getWriter().flush();
		response.getWriter().close();

 

分享到:
评论

相关推荐

    使用HttpURLConnection或HttpClient方式传json值到spring中

    总的来说,无论是使用`HttpURLConnection`还是`HttpClient`,都能有效地将JSON数据发送到Spring服务端。选择哪种方式取决于项目需求和性能考虑。`HttpURLConnection`更轻量,适合简单场景,而`HttpClient`提供了更...

    Android提交数据到服务器端

    在Android应用开发中,将数据提交到服务器是常见的任务,涉及到网络通信技术。这里主要讨论两种方法:使用`HttpURLConnection`和`HttpClient`类。两者都是Android系统提供的API,用于实现HTTP请求,向服务器发送数据...

    以实体数据发送xml,号码归属地查询

    总结来说,"以实体数据发送xml,号码归属地查询"涉及到了XML序列化与反序列化、HTTP请求与响应、Web服务接口设计、数据库查询以及数据解析等多个IT领域的知识点。这些技术在现代网络应用中广泛应用,尤其是当需要跨...

    android使用JSON进行网络数据交换(服务端、客户端)的实现.rar

    这个压缩包“android使用JSON进行网络数据交换(服务端、客户端)的实现.rar”很可能是包含了一个完整的示例项目,展示如何在Android客户端与服务器之间通过JSON进行数据交互。下面我们将详细讲解这一过程中的关键知识...

    HttpPost Gson服务端与客户端的交互

    创建HttpPost对象,设置请求URL,并通过setEntity方法添加请求体,可以将客户端的数据发送到服务器。 其次,Gson库是Google提供的用于序列化和反序列化Java对象到JSON的工具。序列化是将Java对象转换为JSON字符串,...

    如何使用HttpClient发送java对象到服务器

    在软件开发中,经常需要将Java对象发送到服务器,以便于数据交换和处理。使用Apache HttpClient库可以轻松地实现这一功能。本文将详细介绍如何使用HttpClient发送Java对象到服务器。 为什么使用Apache HttpClient?...

    android客户端上传文件,struts2服务端接收

    总的来说,Android客户端通过HTTP POST请求将文件数据发送到服务器,Struts2服务端通过解析请求并处理文件内容来完成接收。在这个过程中,需要注意文件传输的安全性和效率,以及服务端的资源管理。理解并熟练掌握这...

    android批量文件上传(附服务端Demo)

    在Android平台上进行文件上传是一项常见的任务,特别是在移动应用中,用户可能需要上传照片、文档等数据到服务器。本文将深入探讨如何在Android中实现批量文件上传,并结合SpringMVC服务端进行演示。我们将讨论两种...

    commons-httpclient-3.0与commons-codec-1.8

    HttpClient 3.0 特别适用于那些需要与Web服务器进行交互的应用程序,例如数据爬虫、API客户端或需要发送HTTP请求的服务端组件。 在HttpClient中,发送一个POST请求涉及以下步骤: 1. 创建HttpClient实例。 2. 设置...

    mobile_http_xml

    在移动应用开发中,"mobile_http_xml"是一个关键的主题,它涉及到如何在移动设备上使用HTTP协议进行数据传输,并处理XML格式的数据。HTTP是互联网上应用最广泛的一种网络协议,而XML(eXtensible Markup Language)...

    用Java构建web服务

    - 使用HttpClient库或者Java的HttpURLConnection发送HTTP请求。 - 解析响应:接收到JSON或XML后,可以使用Jackson或Gson等库进行解析。 四、容器与部署 Java Web服务通常运行在Servlet容器中,如Tomcat、Jetty等...

    JAVA网络编程从入门到精通

    #### 二十、在服务端接收和发送数据 服务端通过`Socket`对象与客户端交互。 - **读取数据**:使用`InputStream`。 - **发送数据**:使用`OutputStream`。 #### 二十一、关闭服务端连接 确保正确关闭服务端连接,...

    restful-webService

    在Java中,服务端可能通过注解驱动的API来处理HTTP请求,而客户端可以使用HttpURLConnection、Apache HttpClient或者OkHttp等库来发送请求。 8. **接口设计**: 在RESTful服务中,接口设计是非常关键的。良好的...

    Android典型技术模块开发详解

    9.8.1 设计实体类 9.8.2 基于ListView的实现 9.9 本章小结 第10章 数据存储 10.1 File(文件) 10.1.1 java.io包的方法 10.1.2 openFileInput和openFileOutput 10.1.3 从resource中的raw文件夹中读取文件 10.1.4 从...

    JavaGuide.zip

    8. **网络编程**:Java提供了丰富的API来处理网络编程,如Socket和ServerSocket类用于创建客户端和服务端连接,HTTPURLConnection用于发送HTTP请求。 9. **反射机制**:Java的反射机制允许我们在运行时动态地获取类...

    JAVA调用HTTP及httpclient的详细说明

    在使用Apache HttpClient之前,首先需要将其添加到项目依赖中。如果你使用Maven管理项目,可以在`pom.xml`文件中添加以下依赖: ```xml &lt;groupId&gt;org.apache.httpcomponents &lt;artifactId&gt;httpclient &lt;version&gt;...

    Web Service 入门

    - 客户端访问:通过HTTP库(如Apache HttpClient或Java的HttpURLConnection)直接发送HTTP请求,获取响应。 3. WSDL与UDDI: 在SOAP Web服务中,WSDL(Web Services Description Language)是XML格式的文档,用于...

Global site tag (gtag.js) - Google Analytics