java http post/get 服务端和客户端实现json传输
最近需要写http post接口所以学习下。
总的还是不难直接上源码!
1 PostHttpClient.java 客户端 2 import java.io.IOException; 3 import org.apache.commons.httpclient.HttpClient; 4 import org.apache.commons.httpclient.HttpException; 5 import org.apache.commons.httpclient.HttpStatus; 6 import org.apache.commons.httpclient.methods.ByteArrayRequestEntity; 7 import org.apache.commons.httpclient.methods.EntityEnclosingMethod; 8 import org.apache.commons.httpclient.methods.PostMethod; 9 import org.apache.commons.httpclient.methods.RequestEntity; 10 11 12 /** 13 * ******************************************************** 14 * 采用httpclient插件的post方式发送流二进制流数据到HTTP服务端 15 ********************************************************** 16 * ---@author [zt_zoro1272@163.com ] 17 ********************************************************** 18 * ---@version 19 ********************************************************** 20 * ---@since 2014-8-28 21 */ 22 public class PostHttpClient { 23 24 25 /** 26 * ******************************************************** 27 * ---功能描述: 发送post请求,客户端采用二进制流发送,服务端采用二进制流介绍 28 ********************************************************** 29 * ---@param json 入参的json格式的报文 30 * ---@param url http服务器的地址 31 * ---@return 返回响应信息 32 ********************************************************** 33 * ---@author [zt_zoro1272@163.com ] 34 ********************************************************** 35 * ---@since 2014-8-28 36 ********************************************************** 37 * ---@update:[变更日期YYYY-MM-DD][更改人姓名][变更描述] 38 ********************************************************** 39 * 40 */ 41 public static String postHttpReq(String json,String url) { 42 HttpClient httpClient = new HttpClient(); 43 44 byte b[] = json.getBytes();//把字符串转换为二进制数据 45 RequestEntity requestEntity = new ByteArrayRequestEntity(b); 46 47 EntityEnclosingMethod postMethod = new PostMethod(); 48 postMethod.setRequestEntity(requestEntity);// 设置数据 49 postMethod.setPath(url);// 设置服务的url 50 postMethod.setRequestHeader("Content-Type", "text/html;charset=GBK");// 设置请求头编码 51 52 // 设置连接超时 53 httpClient.getHttpConnectionManager().getParams().setConnectionTimeout( 54 5 * 1000); 55 // 设置读取超时 56 httpClient.getHttpConnectionManager().getParams().setSoTimeout(20 * 1000); 57 58 String responseMsg = ""; 59 int statusCode = 0; 60 try { 61 statusCode = httpClient.executeMethod(postMethod);// 发送请求 62 responseMsg = postMethod.getResponseBodyAsString();// 获取返回值 63 } catch (HttpException e) { 64 e.printStackTrace(); 65 } catch (IOException e) { 66 e.printStackTrace(); 67 } finally { 68 postMethod.releaseConnection();// 释放连接 69 } 70 71 if (statusCode != HttpStatus.SC_OK) { 72 System.out.println("HTTP服务异常" + statusCode); 73 } 74 return responseMsg; 75 } 76 77 //POST方式发送HTTP请求 78 public static void main(String[] args) { 79 String json = "{\"PubInfo\": {\"clinet\": \"10.70.128.132\",\"company\": \"月月鸟0820\"},\"Request\": {\"strBillId\": \"18221075148\",\"strCcsOpId\": \"1234\"}}"; 80 String url = "http://localhost:8080/httl_online/postHttpServer"; 81 String outPackage = null; 82 outPackage = postHttpReq(json, url); 83 System.out.println("客户端日志----POST方式调用HTTP,请求报文为:" + json); 84 System.out 85 .println("\nauthor<pantp>===========客户端日志----POST方式调用HTTP服务,HTTP服务端响应报文如下:=============\n"); 86 87 System.out.println(outPackage); 88 89 System.out 90 .println("\nauthor<pantp>================================================================\n"); 91 } 92 93 }
1 PostHttpServer.java 服务端 2 import java.io.BufferedReader; 3 import java.io.IOException; 4 import java.io.InputStream; 5 import java.io.UnsupportedEncodingException; 6 import java.net.URLDecoder; 7 import java.security.Principal; 8 import java.util.Arrays; 9 import java.util.Collections; 10 import java.util.Enumeration; 11 import java.util.HashMap; 12 import java.util.Locale; 13 import java.util.Map; 14 15 import javax.servlet.RequestDispatcher; 16 import javax.servlet.ServletException; 17 import javax.servlet.ServletInputStream; 18 import javax.servlet.http.Cookie; 19 import javax.servlet.http.HttpServlet; 20 import javax.servlet.http.HttpServletRequest; 21 import javax.servlet.http.HttpServletResponse; 22 import javax.servlet.http.HttpSession; 23 24 25 /** 26 * ******************************************************** 27 * 模拟的一个Http服务,处理客户端的post请求 28 ********************************************************** 29 * ---@author [zt_zoro1272@163.com ] 30 ********************************************************** 31 * ---@version 32 ********************************************************** 33 * ---@since 2014-8-28 34 */ 35 public class PostHttpServer extends HttpServlet { 36 37 private static final long serialVersionUID = 1L; 38 39 /* 40 * 代码逻辑分以下三部分: 41 * 1.获得请求报文 42 * 2.根据请求报文的信息去做业务逻辑,然后封装返回报文 43 * 3.输出相应报文 44 */ 45 protected void doPost(HttpServletRequest request, 46 HttpServletResponse response) throws ServletException, IOException { 47 String inJson = null;// 保存HTTP客户端请求报文 48 String outJson = null;// 保存HTTP服务端输出报文 49 50 // 获得输人报文然后打印出来 51 inJson = getInJson(request); 52 System.out 53 .println("\nauthor<pantp>===========服务端日志----POST方式接收HTTP请求,HTTP服务端收到的请求报文如下:==========\n"); 54 System.out.println(inJson); 55 System.out 56 .println("\nauthor<pantp>=================================================================\n"); 57 58 // 以下代码部分获得请求报文,然后去做校验,转换以及其他的调用其他的业务逻辑等,这里就不管它 59 // ........................................................................ 60 61 // 下面部分是输出部分的处理 62 outJson = "{\"Response\": {\"code\": \"0\",\"message\": \"成功\",\"data\": \"12345\"}}";// 输出不部分也以JSON格式的字符串输出,这里我就写死 63 64 response.setContentType("application/json; charset=UTF-8"); 65 response.getWriter().print(outJson); 66 } 67 68 // 获得请求的报文,并作简单的校验 69 public String getInJson(HttpServletRequest request) throws IOException { 70 71 byte buffer[] = new byte[64 * 1024]; 72 InputStream in = request.getInputStream();// 获取输入流对象 73 74 int len = in.read(buffer); 75 // 必须对数组长度进行判断,否则在new byte[len]会报NegativeArraySizeException异常 76 if (len < 0) { 77 throw new IOException("请求报文为空"); 78 } 79 80 String encode = request.getCharacterEncoding();// 获取请求头编码 81 // 必须对编码进行校验,否则在new String(data, encode);会报空指针异常 82 if (null == encode || encode.trim().length() < 0) { 83 throw new IOException("请求报文未指明请求编码"); 84 } 85 86 byte data[] = new byte[len]; 87 88 // 把buffer数组的值复制到data数组 89 System.arraycopy(buffer, 0, data, 0, len); 90 91 // 通过使用指定的 charset 解码指定的 byte 数组,构造一个新的 String 92 String inJson = new String(data, encode); 93 94 return inJson; 95 } 96 97 // 不提供get的处理方式 98 protected void doGet(HttpServletRequest request, HttpServletResponse response) 99 throws ServletException, IOException { 100 String inJson = null;// 保存HTTP客户端请求报文 101 String outJson = null;// 保存HTTP服务端输出报文 102 103 // 获得输人报文然后打印出来 104 inJson = getInJson(request); 105 System.out 106 .println("\nauthor<pantp>===========服务端日志----POST方式接收HTTP请求,HTTP服务端收到的请求报文如下:==========\n"); 107 System.out.println(inJson); 108 System.out 109 .println("\nauthor<pantp>=================================================================\n"); 110 111 // 以下代码部分获得请求报文,然后去做校验,转换以及其他的调用其他的业务逻辑等,这里就不管它 112 // ........................................................................ 113 114 // 下面部分是输出部分的处理 115 outJson = "{\"Response\": {\"code\": \"0\",\"message\": \"成功\",\"data\": \"12345\"}}";// 输出不部分也以JSON格式的字符串输出,这里我就写死 116 117 response.setContentType("application/json; charset=UTF-8"); 118 response.getWriter().print(outJson); 119 } 120 121 122 }
web.xml配置
1 <!-- 模拟HTTP的调用,写的一个只处理POST请求的http服务 --> 2 <servlet> 3 <servlet-name>PostHttpServer</servlet-name> 4 <servlet-class>com.sitechasia.xinnet.online.util.cloudhttp.PostHttpServer</servlet-class> 5 </servlet> 6 7 <servlet-mapping> 8 <servlet-name>PostHttpServer</servlet-name> 9 <url-pattern>/postHttpServer</url-pattern> 10 </servlet-mapping> 11
这样一个简单的httl post客户端就完成了,启动tomcat直接执行客户端mian方法就OK
如今的编程是一场程序员和上帝的竞赛,程序员要开发出更大更好、傻瓜都会用到软件。而上帝在努力创造出更大更傻的傻瓜。目前为止,上帝是赢的。
QQ:6203142
-----在北京的四川小伙