使用JAVA实现http通信详解

Http通信概述

Http通信主要有两种方式POST方式和GET方式。前者通过Http消息实体发送数据给服务器,安全性高,数据传输大小没有限制,后者通过URL的查询字符串传递给服务器参数,以明文显示在浏览器地址栏,保密性差,最多传输2048个字符。但是GET请求并不是一无是处——GET请求大多用于查询(读取资源),效率高。POST请求用于注册、登录等安全性较高且向数据库中写入数据的操作。

除了POST和GET,http通信还有其他方式!请参见http请求的方法

编码前的准备

在进行编码之前,我们先创建一个Servlet,该Servlet接收客户端的参数(name和age),并响应客户端。

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

@WebServlet(urlPatterns={"/demo.do"})

public class DemoServlet extends HttpServlet {

  private static final long serialVersionUID = 1L;

  public void doGet(HttpServletRequest request, HttpServletResponse response)

      throws ServletException, IOException {

    request.setCharacterEncoding("utf-8");

    response.setContentType("text/html;charset=utf-8");

    String name = request.getParameter("name");

    String age = request.getParameter("age");

    PrintWriter pw = response.getWriter();

    pw.print("您使用GET方式请求该Servlet。<br />" + "name = " + name + ",age = " + age);

    pw.flush();

    pw.close();

  }

  public void doPost(HttpServletRequest request, HttpServletResponse response)

      throws ServletException, IOException {

    request.setCharacterEncoding("utf-8");

    response.setContentType("text/html;charset=utf-8");

    String name = request.getParameter("name");

    String age = request.getParameter("age");

    PrintWriter pw = response.getWriter();

    pw.print("您使用POST方式请求该Servlet。<br />" + "name = " + name + ",age = " + age);

    pw.flush();

    pw.close();

  }

}

使用JDK实现http通信

使用URLConnection实现GET请求

实例化一个java.net.URL对象;
通过URL对象的openConnection()方法得到一个java.net.URLConnection;
通过URLConnection对象的getInputStream()方法获得输入流;
读取输入流;
关闭资源。

?


1

2

3

4

5

6

7

8

9

10

11

12

13

public void get() throws Exception{

  URL url = new URL("http://127.0.0.1/http/demo.do?name=Jack&age=10");

  URLConnection urlConnection = url.openConnection();                          // 打开连接

  BufferedReader br = new BufferedReader(new InputStreamReader(urlConnection.getInputStream(),"utf-8")); // 获取输入流

  String line = null;

  StringBuilder sb = new StringBuilder();

  while ((line = br.readLine()) != null) {

    sb.append(line + "\n");

  }

  System.out.println(sb.toString());

}

使用HttpURLConnection实现POST请求

java.net.HttpURLConnection是java.net.URL的子类,提供了更多的关于http的操作(getXXX 和 setXXX方法)。该类中定义了一系列的HTTP状态码:

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

public void post() throws IOException{

  URL url = new URL("http://127.0.0.1/http/demo.do");

  HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();

  httpURLConnection.setDoInput(true);

  httpURLConnection.setDoOutput(true);    // 设置该连接是可以输出的

  httpURLConnection.setRequestMethod("POST"); // 设置请求方式

  httpURLConnection.setRequestProperty("charset", "utf-8");

  PrintWriter pw = new PrintWriter(new BufferedOutputStream(httpURLConnection.getOutputStream()));

  pw.write("name=welcome");          // 向连接中输出数据(相当于发送数据给服务器)

  pw.write("&age=14");

  pw.flush();

  pw.close();

  BufferedReader br = new BufferedReader(new InputStreamReader(httpURLConnection.getInputStream(),"utf-8"));

  String line = null;

  StringBuilder sb = new StringBuilder();

  while ((line = br.readLine()) != null) {  // 读取数据

    sb.append(line + "\n");

  }

  System.out.println(sb.toString());

}

使用httpclient进行http通信

httpclient大大简化了JDK中http通信的实现。

maven依赖:

?


1

2

3

4

5

<dependency>

  <groupId>org.apache.httpcomponents</groupId>

  <artifactId>httpclient</artifactId>

  <version>4.3.6</version>

</dependency>

GET请求

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

public void httpclientGet() throws Exception{

  // 创建HttpClient对象

  HttpClient client = HttpClients.createDefault();

  // 创建GET请求(在构造器中传入URL字符串即可)

  HttpGet get = new HttpGet("http://127.0.0.1/http/demo.do?name=admin&age=40");

  // 调用HttpClient对象的execute方法获得响应

  HttpResponse response = client.execute(get);

  // 调用HttpResponse对象的getEntity方法得到响应实体

  HttpEntity httpEntity = response.getEntity();

  // 使用EntityUtils工具类得到响应的字符串表示

  String result = EntityUtils.toString(httpEntity,"utf-8");

  System.out.println(result);

}

POST请求

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

public void httpclientPost() throws Exception{

  // 创建HttpClient对象

  HttpClient client = HttpClients.createDefault();

  // 创建POST请求

  HttpPost post = new HttpPost("http://127.0.0.1/http/demo.do");

  // 创建一个List容器,用于存放基本键值对(基本键值对即:参数名-参数值)

  List<BasicNameValuePair> parameters = new ArrayList<>();

  parameters.add(new BasicNameValuePair("name", "张三"));

  parameters.add(new BasicNameValuePair("age", "25"));

  // 向POST请求中添加消息实体

  post.setEntity(new UrlEncodedFormEntity(parameters, "utf-8"));

  // 得到响应并转化成字符串

  HttpResponse response = client.execute(post);

  HttpEntity httpEntity = response.getEntity();

  String result = EntityUtils.toString(httpEntity,"utf-8");

  System.out.println(result);

}

HttpClient是Apache Jakarta Common下的子项目,用来提供高效的、最新的、功能丰富的支持HTTP协议的客户端编程工具包,并且它支持HTTP协议最新的版本和建议。HttpClient已经应用在很多的项目中,比如Apache Jakarta上很著名的另外两个开源项目Cactus和HTMLUnit都使用了HttpClient。

时间: 2024-09-30 14:25:43

使用JAVA实现http通信详解的相关文章

Android中实现java与PHP服务器(基于新浪云免费云平台)http通信详解

Android中实现java与PHP服务器(基于新浪云免费云平台)http通信详解 (本文转自: http://blog.csdn.net/yinhaide/article/details/44756989) 前言:现在很多APP都需要云的功能,也就是通过网络与服务器交换数据.有的采用tcp/ip协议,但是你必须拥有一个固定ip的服务器,可以购买阿里云服务器之类的,就是贵了点.如果只是个人的小应用的的话可以采用新浪云平台这种免费的服务器,采用的协议是http协议,具体实现方式如下: 方式一.在线

Java串口通信详解(转)

Java串口通信详解(转) 作者:denimcc 日期:2007-05-11 序言    说到开源,恐怕很少有人不挑大指称赞.学生通过开源代码学到了知识,程序员通过开源类库获得了别人的成功经验及能够按时完成手头的工程,商家通过开源软件赚到了钱……,总之是皆大欢喜.然而开源软件或类库的首要缺点就是大多缺乏详细的说明文档和使用的例子,或者就是软件代码随便你用,就是文档,例子和后期服务收钱.                                                        

java classLoader体系结构使用详解

原创整理不易,转载请注明出处:java classLoader体系结构使用详解 代码下载地址:http://www.zuidaima.com/share/1774052029516800.htm jvm classLoader architecture: Bootstrap ClassLoader/启动类加载器 主要负责jdk_home/lib目录下的核心 api 或 -Xbootclasspath 选项指定的jar包装入工作. Extension ClassLoader/扩展类加载器  主要负

Java内存模型(JMM)详解

在Java JVM系列文章中有朋友问为什么要JVM,Java虚拟机不是已经帮我们处理好了么?同样,学习Java内存模型也有同样的问题,为什么要学习Java内存模型.它们的答案是一致的:能够让我们更好的理解底层原理,写出更高效的代码. 就Java内存模型而言,它是深入了解Java并发编程的先决条件.对于后续多线程中的线程安全.同步异步处理等更是大有裨益. 硬件内存架构 在学习Java内存模型之前,先了解一下计算机硬件内存模型.我们多知道处理器与计算机存储设备运算速度有几个数量级的差别.总不能让处理

《Java网络编程核心技术详解》赶稿中......

<精通JPA与Hibernate:Java对象持久化技术详解>这本书写完,就开始着手写<Java网络编程核心技术详解>一书,已经写了一大半,内容包括:Java网络编程的基础知识. 套接字编程.非阻塞通信.创建HTTP服务器与客户程序.数据报通信.对象的序列化与反序列化.Java反射机制.RMI框架.JDBC API.JavaMail API.MVC设计模式.XML处理.安全网络通信.CORBA和Web服务. 每写一章,都会遇到一些挑战,主要是在调试程序时,没有出现预期的结果.例如分

Java虚拟机工作原理详解

原文地址:http://blog.csdn.net/bingduanlbd/article/details/8363734 一.类加载器 首先来看一下java程序的执行过程. 从这个框图很容易大体上了解java程序工作原理.首先,你写好java代码,保存到硬盘当中.然后你在命令行中输入 [java] view plaincopy javac YourClassName.java 此时,你的java代码就被编译成字节码(.class).如果你是在Eclipse IDE或者其他开发工具中,你保存代码

Java的位运算符详解实例

Java的位运算符详解实例——与(&).非(~).或(|).异或(^).右移(>>).左移(<<).无符号右移(>>>) 位运算符主要针对二进制, 它包括了:“与”.“非”.“或”.“异或”."右移"."左移"."无符号右移". 从表面上看似乎有点像逻辑运算符, 但逻辑运算符是针对两个关系运算符来进行逻辑运算, 而位运算符主要针对两个二进制数的位进行逻辑运算. 下面详细介绍每个位运算符. 1.与运

java中static作用详解

static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念. 被static修饰的成员变量和成员方法独立于该类的任何对象.也就是说,它不依赖类特定的实例,被类的所有实例共享. 只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内定找到他们.因此,static对象可以在它的任何对象创建之前访问,无需引用任何对象. 用public修饰的static成员变量和成员方法本质是全局变量和全局方法,当声明它类

Java Service Wrapper配置详解

1 #encoding=UTF-8 2 # Configuration files must begin with a line specifying the encoding 3 # of the the file. 4 5 #******************************************************************** 6 # Wrapper License Properties (Ignored by Community Edition) 7 #*