HttpURLConnection与HttpClient比较和使用示例

本文详细对比了Java中HttpURLConnection和HttpClient在GET、POST请求中的使用,探讨了它们的区别和应用场景。HttpURLConnection是Java标准类,适用于简单请求,而HttpClient则更适合处理复杂的HTTP请求,如Session、Cookie管理。文中通过示例代码展示了两者如何发送请求、接收响应,并解释了在处理中文字符时的注意事项和解决方法。
摘要由CSDN通过智能技术生成

1. GET请求与POST请求

HTTP协议是现在Internet上使用得最多、最重要的协议了,越来越多的Java应用程序需要直接通过HTTP协议来访问网络资源。

在介绍HttpURLConnection前,我们还是再来说一下URL请求最常用的两种方式:GET请求与POST请求。

GET请求的数据会附在URL之后(就是把数据放置在HTTP协议头中),以?分割URL和传输数据,参数之间以&相连,如:http://localhost:8080/test.do?name=test&password=123456。

GET请求发送的参数如果数据是英文字母或数字,则按原样发送,如果是空格,则转换为+,如果是中文或其他字符,则直接把字符串用BASE64加密,得出如 %E4%BD%A0%E5%A5%BD 这类似的字符串,其中%XX中的XX为该符号以16进制表示的ASCII。

POST请求的参数不是放在URL字符串里面,而是放在HTTP请求的正文内,请求的参数被封装起来以流的形式发送给服务端。

对于GET方式提交数据的大小,HTTP协议并没有硬性限制,但某些浏览器及服务器会对它进行限制,如IE对URL长度的限制是2083字节(2K+35)。理论上POST也没有限制,可传较大量的数据。

POST的安全性要比GET的安全性高。比如:通过GET提交数据,用户名和密码将明文出现在URL上,因为登录页面有可能被浏览器缓存,如果其他人查看浏览器的历史纪录,那么别人就可以拿到你的账号和密码了,除此之外,使用GET提交数据还可能会造成Cross-site request forgery(CSRF,跨站请求伪造)攻击。

一般来说,Get是向服务器索取数据的一种请求,而Post是向服务器提交数据的一种请求。

2. HttpURLConnection简介

JDK的java.net包中已经提供了访问HTTP协议的基本功能的类:HttpURLConnection。

HttpURLConnection是Java的标准类,它继承自URLConnection,可用于向指定网站发送GET请求、POST请求。它在URLConnection的基础上提供了如下便捷的方法:

int getResponseCode(); // 获取服务器的响应代码。

String getResponseMessage(); // 获取服务器的响应消息。

String getResponseMethod(); // 获取发送请求的方法。

void setRequestMethod(String method); // 设置发送请求的方法。

3. HttpURLConnection的使用

3.1 使用GET方式访问HTTP

package com.qf.demo;

 

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

import java.net.HttpURLConnection;

import java.net.URL;

 

/**

 * GET请求示例

 *

 * @author 小明

 *

 */

public class GetDemo {

 

    public static void main(String[] args) {

        try {

            // 1. 得到访问地址的URL

            URL url = new URL(

                    "http://localhost:8080/Servlet/do_login.do?username=test&password=123456");

            // 2. 得到网络访问对象java.net.HttpURLConnection

            HttpURLConnection connection = (HttpURLConnection) url

                    .openConnection();

            /* 3. 设置请求参数(过期时间,输入、输出流、访问方式),以流的形式进行连接 */

            // 设置是否向HttpURLConnection输出

            connection.setDoOutput(false);

            // 设置是否从httpUrlConnection读入

            connection.setDoInput(true);

            // 设置请求方式

            connection.setRequestMethod("GET");

            // 设置是否使用缓存

            connection.setUseCaches(true);

            // 设置此 HttpURLConnection 实例是否应该自动执行 HTTP 重定向

            connection.setInstanceFollowRedirects(true);

            // 设置超时时间

            connection.setConnectTimeout(3000);

            // 连接

            connection.connect();

            // 4. 得到响应状态码的返回值 responseCode

            int code = connection.getResponseCode();

            // 5. 如果返回值正常,数据在网络中是以流的形式得到服务端返回的数据

            String msg = "";

            if (code == 200) { // 正常响应

                // 从流中读取响应信息

                BufferedReader reader = new BufferedReader(

                        new InputStreamReader(connection.getInputStream()));

                String line = null;

 

                while ((line = reader.readLine()) != null) { // 循环从流中读取

                    msg += line + "\n";

                }

                reader.close(); // 关闭流

            }

            // 6. 断开连接,释放资源

            connection.disconnect();

 

            // 显示响应结果

            System.out.println(msg);

        } catch (IOException e) { </

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值