探讨:使用httpClient在客户端与服务器端传输对象参数的详解
更新时间:2013年06月04日 11:31:34 作者:
本篇文章是对使用httpClient在客户端与服务器端传输对象参数进行了详细的分析介绍,需要的朋友参考下
昨天把httpClient的源代码下载来看了一下。 稍微跟踪了一下,最终还是使用java.net包的东西.不过封装的实在是漂亮.写程序方便多了。不过还是建议最好先熟悉net包下的东西.为了测试写了个在客户端和服务器段传对象的代码. 简单的传递了一个字符串. 如果复杂点可以传其他的对象,在参数里给出class name之类的信息.服务器端就可以使用反射来做一些实用的操作了。
客户端:
import java.io.IOException;
import java.io.Serializable;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.methods.InputStreamRequestEntity;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.methods.RequestEntity;
public class MyTest
{
/**
* @param args
* @throws IOException
* @throws ClassNotFoundException
*/
public static void main(String[] args) throws IOException, ClassNotFoundException
{
String url = "http://localhost:8084/system/linantest";
String queryString = "test=hello";
String inputObj = " boy!";
Serializable s = getObjFromServer(url, queryString, inputObj);
System.out.println(s.toString());
}
/**
* @param url
* @param queryString 类似a=b&c=d 形式的参数
*
* @param inputObj 发送到服务器的对象。
*
* @return 服务器返回到客户端的对象。
* @throws IOException
*/
public static Serializable getObjFromServer(String url, String queryString, Serializable inputObj) throws IOException
{
HttpClient client = new HttpClient();
PostMethod post = new PostMethod(url);
post.setQueryString(queryString);
post.setRequestHeader("Content-Type", "application/octet-stream");
java.io.ByteArrayOutputStream bOut = new java.io.ByteArrayOutputStream(1024);
java.io.ByteArrayInputStream bInput = null;
java.io.ObjectOutputStream out = null;
Serializable returnObj = null;
try
{
out = new java.io.ObjectOutputStream(bOut);
out.writeObject(inputObj);
out.flush();
out.close();
out = null;
bInput = new java.io.ByteArrayInputStream(bOut.toByteArray());
RequestEntity re = new InputStreamRequestEntity(bInput);
post.setRequestEntity(re);
client.executeMethod(post);
java.io.InputStream in = post.getResponseBodyAsStream();
java.io.ObjectInputStream oInput = new java.io.ObjectInputStream(in);
returnObj = (Serializable) oInput.readObject();
oInput.close();
oInput = null;
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (ClassNotFoundException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
finally
{
if (out != null)
{
out.close();
out = null;
}
if (bInput != null)
{
bInput.close();
bInput = null;
}
//释放连接
post.releaseConnection();
}
return returnObj;
}
}
服务器端的servlet
package test.li;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.openjweb.eai.adapter.TimerDBAdapter;
public class TestServlet extends HttpServlet
{
public TestServlet()
{
super();
}
/**
* Destruction of the servlet. <br>
*/
public void destroy()
{
super.destroy(); // Just puts "destroy" string in log
// Put your code here
}
/**
* The doGet method of the servlet. <br>
*
* This method is called when a form has its tag value method equals to get.
*
* @param request
* the request send by the client to the server
* @param response
* the response send by the server to the client
* @throws Exception
*/
public void doGet(HttpServletRequest request, HttpServletResponse response)
{
String test = request.getParameter("test");
java.io.ObjectInputStream oi = null;
java.io.ObjectOutputStream ot = null;
try
{
oi = new java.io.ObjectInputStream(request.getInputStream());
Object o = oi.readObject();
oi.close();
oi = null;
String outObj = test + o.toString();
ot = new java.io.ObjectOutputStream(response.getOutputStream());
ot.writeObject(outObj);
ot.flush();
ot.close();
ot = null;
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (ClassNotFoundException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
finally
{
try
{
if (oi != null)
{
oi.close();
oi = null;
}
if (ot != null)
{
ot.close();
ot = null;
}
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
/**
* The doPost method of the servlet. <br>
*
* This method is called when a form has its tag value method equals to
* post.
*
* @param request
* the request send by the client to the server
* @param response
* the response send by the server to the client
* @throws ServletException
* if an error occurred
* @throws IOException
* if an error occurred
*/
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
doGet(request, response);
}
/**
* Initialization of the servlet. <br>
*
* @throws ServletException
* if an error occure
*/
public void init() throws ServletException
{
// Put your code here
}
}
客户端:
复制代码 代码如下:
import java.io.IOException;
import java.io.Serializable;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.methods.InputStreamRequestEntity;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.methods.RequestEntity;
public class MyTest
{
/**
* @param args
* @throws IOException
* @throws ClassNotFoundException
*/
public static void main(String[] args) throws IOException, ClassNotFoundException
{
String url = "http://localhost:8084/system/linantest";
String queryString = "test=hello";
String inputObj = " boy!";
Serializable s = getObjFromServer(url, queryString, inputObj);
System.out.println(s.toString());
}
/**
* @param url
* @param queryString 类似a=b&c=d 形式的参数
*
* @param inputObj 发送到服务器的对象。
*
* @return 服务器返回到客户端的对象。
* @throws IOException
*/
public static Serializable getObjFromServer(String url, String queryString, Serializable inputObj) throws IOException
{
HttpClient client = new HttpClient();
PostMethod post = new PostMethod(url);
post.setQueryString(queryString);
post.setRequestHeader("Content-Type", "application/octet-stream");
java.io.ByteArrayOutputStream bOut = new java.io.ByteArrayOutputStream(1024);
java.io.ByteArrayInputStream bInput = null;
java.io.ObjectOutputStream out = null;
Serializable returnObj = null;
try
{
out = new java.io.ObjectOutputStream(bOut);
out.writeObject(inputObj);
out.flush();
out.close();
out = null;
bInput = new java.io.ByteArrayInputStream(bOut.toByteArray());
RequestEntity re = new InputStreamRequestEntity(bInput);
post.setRequestEntity(re);
client.executeMethod(post);
java.io.InputStream in = post.getResponseBodyAsStream();
java.io.ObjectInputStream oInput = new java.io.ObjectInputStream(in);
returnObj = (Serializable) oInput.readObject();
oInput.close();
oInput = null;
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (ClassNotFoundException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
finally
{
if (out != null)
{
out.close();
out = null;
}
if (bInput != null)
{
bInput.close();
bInput = null;
}
//释放连接
post.releaseConnection();
}
return returnObj;
}
}
服务器端的servlet
复制代码 代码如下:
package test.li;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.openjweb.eai.adapter.TimerDBAdapter;
public class TestServlet extends HttpServlet
{
public TestServlet()
{
super();
}
/**
* Destruction of the servlet. <br>
*/
public void destroy()
{
super.destroy(); // Just puts "destroy" string in log
// Put your code here
}
/**
* The doGet method of the servlet. <br>
*
* This method is called when a form has its tag value method equals to get.
*
* @param request
* the request send by the client to the server
* @param response
* the response send by the server to the client
* @throws Exception
*/
public void doGet(HttpServletRequest request, HttpServletResponse response)
{
String test = request.getParameter("test");
java.io.ObjectInputStream oi = null;
java.io.ObjectOutputStream ot = null;
try
{
oi = new java.io.ObjectInputStream(request.getInputStream());
Object o = oi.readObject();
oi.close();
oi = null;
String outObj = test + o.toString();
ot = new java.io.ObjectOutputStream(response.getOutputStream());
ot.writeObject(outObj);
ot.flush();
ot.close();
ot = null;
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (ClassNotFoundException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
finally
{
try
{
if (oi != null)
{
oi.close();
oi = null;
}
if (ot != null)
{
ot.close();
ot = null;
}
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
/**
* The doPost method of the servlet. <br>
*
* This method is called when a form has its tag value method equals to
* post.
*
* @param request
* the request send by the client to the server
* @param response
* the response send by the server to the client
* @throws ServletException
* if an error occurred
* @throws IOException
* if an error occurred
*/
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
doGet(request, response);
}
/**
* Initialization of the servlet. <br>
*
* @throws ServletException
* if an error occure
*/
public void init() throws ServletException
{
// Put your code here
}
}
相关文章
SpringBoot通过redisTemplate调用lua脚本并打印调试信息到redis log(方法步骤详解)
这篇文章主要介绍了SpringBoot通过redisTemplate调用lua脚本 并打印调试信息到redis log,本文分步骤给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下2020-02-02Intellij IDEA 如何通过数据库表生成带注解的实体类(图文详细教程)
这篇文章主要介绍了Intellij IDEA 如何通过数据库表生成带注解的实体类(图文详细教程),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2019-11-11基于Java的Socket多客户端Client-Server聊天程序的实现
这篇文章主要介绍了基于Java的Socket多客户端Client-Server聊天程序的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2020-03-03Spring Boot 2.7.6整合redis与低版本的区别
这篇文章主要介绍了Spring Boot 2.7.6整合redis与低版本的区别,文中补充介绍了SpringBoot各个版本使用Redis之间的区别实例讲解,需要的朋友可以参考下2023-02-02
最新评论