get/post发送HTTP请求2

来源:互联网 发布:加强网络安全管理通知 编辑:程序博客网 时间:2024/06/04 00:49

本节摘要:之前介绍过采用httpclient发送get和post请求到http服务器端,那么我们不用这个插件是否也可以正常的用get/post方式发送http请求到http服务端呢?毕竟用这个插件要下载,还要去看一大推的API,不是那么的方便,那么,咱们就用JDK自带的URL类和HttpURLConnection类来完成get/post方式的HTTP请求。

 

要查看基于httpclient的方式发送http请求,请查看之前的博客:http://www.cnblogs.com/java-pan/archive/2012/02/26/httpclient-post-get.html

 

本节比较简单,就不在和之前的博客一样,按一条一条的来写。

 

场景介绍:

项目中采用http+json的方法访问http服务,客户端发送二进制数据给http服务器端,http服务器端收到请求后,先把二进制数据转换为json字符串,然后再去做一推的逻辑处理,最后把处理的结果以json格式的字符串返回给客户端。

HTTP服务器端----服务端采用的是servlet来写的一个http服务,这里只贴出服务器端接收到二进制数据并且转换为json字符串的代码

复制代码
 1     /** 2      * 获取二进制的报文体,并转换成字符串 3      */ 4     public String getContext(HttpServletRequest request) throws ServletException, IOException { 5         byte[] buffer = new byte[64*1024]; 6          7         InputStream in = request.getInputStream(); 8         int length = in.read(buffer); 9         String encode = request.getCharacterEncoding();10 11         byte[] data = new byte[length];12         System.arraycopy(buffer, 0, data, 0, length);13         String context = new String(data, encode);14         15         return context;16     }
复制代码

HTTP客户端----先拼装json字符串,然后转换为二进制数据流发送http请求。拼装json字符串采用jsonobject插件来实现,这里就不贴出来了。

复制代码
 1     /** 2      * 发送请求到http服务然后接收返回报文 3      * @param jsonStr 请求的json格式的字符串 4      * @param path   请求的http服务的路径 5      * @return 返回请求的响应信息 6      * @throws IOException  7      */ 8     public static String channelchange2(String jsonStr, String path) 9             throws IOException {10         // 得到请求报文的二进制数据11         byte[] data = jsonStr.getBytes();12         java.net.URL url = new java.net.URL(path);13         //openConnection() 返回一个 URLConnection 对象,它表示到 URL 所引用的远程对象的连接14         java.net.HttpURLConnection conn = (java.net.HttpURLConnection) url.openConnection();// 打开一个连接15         conn.setRequestMethod("POST");// 设置post方式请求16         conn.setConnectTimeout(5 * 1000);// 设置连接超时时间为5秒  JDK1.5以上才有此方法17         conn.setReadTimeout(20 * 1000);// 设置读取超时时间为20秒 JDK1.5以上才有此方法18         // 打算使用 URL 连接进行输出,则将 DoOutput 标志设置为 true19         conn.setDoOutput(true);20         // 这里只设置内容类型与内容长度的头字段根据传送内容决定21         // 内容类型Content-Type:22         // application/x-www-form-urlencoded、text/xml;charset=GBK23         // 内容长度Content-Length: 3824         conn.setRequestProperty("Content-Type", "text/xml;charset=GBK");25         conn.setRequestProperty("Content-Length", String.valueOf(data.length));26         OutputStream outStream = conn.getOutputStream();// 返回写入到此连接的输出流27         // 把二进制数据写入是输出流28         outStream.write(data);29         // 内存中的数据刷入30         outStream.flush();31         //关闭流32         outStream.close();33 34         String msg = "";// 保存调用http服务后的响应信息35         // 如果请求响应码是200,则表示成功36         if (conn.getResponseCode() == 200) {37             // HTTP服务端返回的编码是UTF-8,故必须设置为UTF-8,保持编码统一,否则会出现中文乱码38             BufferedReader in = new BufferedReader(new InputStreamReader(39                     (InputStream) conn.getInputStream(), "UTF-8"));//返回从此打开的连接读取的输入流40             msg = in.readLine();41             in.close();42         }43         conn.disconnect();// 断开连接44         return msg;45     }
复制代码


说明:

1.因为我们项目组是写服务端,客户端不需要我们写,我只是写了一个客户端来模拟http服务端的调用,故对异常只是抛出,实际中应该捕获住这些异常,比如无法连接到指定的服务,读取数据超时,请求响应失败(200表示响应成功)等等。

 

2.在处理的过程中遇到的一个大的问题就是请求和输出报文的中文问题。

对于请求报文,只要是请求头部和请求内容字段编码统一,服务器端就可以正常的接受,客户端字符串jsonStr编码是GBK,请求头设置为GBK,已经验证服务器端可以正常接受。

对于输出报文,服务器端采用UTF-8的形式输出,客户端也采用UTF-8的形式接受,也已经通过验证,客户端可以正常接受服务器端返回的中文。

 

3.关于java.net.URL和java.net.HttpURLConnection类的介绍请查看JDK的API,本客户端基于JDK1.5开发。

 

4.客户端和服务器端未写明导入类的路径的类,都是普通的java I/O类,此种方式请求http服务端没有采用任何的插件。

 

5.如果不设置请求头的编码,服务端在下面的一句代码会报空指针异常

String context = new String(data, encode);

 

6.关于get方法的请求,这里就不列出来了。只是把post改为get而已。

 

哪位大侠理解的比较深入的,可以说说httpclient请求和此种请求有什么区别?用的时候要怎么来选择呢?

 



原文链接:http://www.cnblogs.com/java-pan/archive/2012/04/27/HTTP-POST-GET.html

0 0
原创粉丝点击