URLConnection发送GET和POST请求

在java.net基础包中内置了URLConnection类,它封装了网络通信的底层实现。
URLConnection类提供了很多的方法让我们能够方便的实现应用层的网络通信。

基本步骤:

  1. 创建 URL 以及 URLConnection对象
  2. 设置 URLConnection对象的连接参数
  3. 连接到服务器
  4. 使用输出流向服务器写数据
  5. 使用输入流从服务器读取数据

以下是使用URLConnection进行GET和POST请求的基础示例程序。
为了让初学者能够直观的认识每个操作细节,我特意对每一行代码都进行了注释。

package com.lanshiqin.utils.net;

import java.io.*;
import java.net.URL;
import java.net.URLConnection;

/**
 * Created by 蓝士钦 on 2017/4/16.
 * 网络请求工具类
 */
public class NetUtil {

    /**
     * 使用GET方法读取http中的数据
     *
     * @param urlAddress url地址
     * @return 请求的响应数据
     */
    public static String doGET(String urlAddress) {
        try {
            // 创建URL对象
            URL url = new URL(urlAddress);
            // 打开连接 获取连接对象
            URLConnection connection = url.openConnection();

            // 从连接对象中获取网络连接中的输入字节流对象
            InputStream inputStream = connection.getInputStream();
            // 将输入字节流包装成输入字符流对象,并进行字符编码
            InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "UTF-8");
            // 创建一个输入缓冲区对象,将字符流对象传入
            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);

            // 定义一个字符串变量,用来接收输入缓冲区中的每一行字符串数据
            String line;
            // 创建一个可变字符串对象,用来装载缓冲区对象的数据,使用字符串追加的方式,将响应的所有数据都保存在该对象中
            StringBuilder stringBuilder = new StringBuilder();
            // 使用循环逐行读取输入缓冲区的数据,每次循环读入一行字符串数据赋值给line字符串变量,直到读取的行为空时标识内容读取结束循环
            while ((line = bufferedReader.readLine()) != null) {
                // 将从输入缓冲区读取到的数据追加到可变字符对象中
                stringBuilder.append(line);
            }
            // 依次关闭打开的输入流
            bufferedReader.close();
            inputStreamReader.close();
            inputStream.close();
            // 将可变字符串转换成String对象返回
            return stringBuilder.toString();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 使用POST方法读取HTTP中的数据
     *
     * @param urlAddress url地址
     * @param params     参数
     * @return 请求的响应数据
     */
    public static String doPOST(String urlAddress, String params) {
        try {
            // 创建URL对象
            URL url = new URL(urlAddress);
            // 打开连接 获取连接对象
            URLConnection connection = url.openConnection();
            // 设置请求编码
            connection.addRequestProperty("encoding", "UTF-8");
            // 设置允许输入
            connection.setDoInput(true);
            // 设置允许输出
            connection.setDoOutput(true);

            // 从连接对象中获取输出字节流对象
            OutputStream outputStream = connection.getOutputStream();
            // 将输出的字节流对象包装成字符流写出对象
            OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream);
            // 创建一个输出缓冲区对象,将要输出的字符流写出对象传入
            BufferedWriter bufferedWriter = new BufferedWriter(outputStreamWriter);
            // 向输出缓冲区中写入请求参数
            bufferedWriter.write(params);
            // 刷新输出缓冲区
            bufferedWriter.flush();

            // 从连接对象中获取输入字节流对象
            InputStream inputStream = connection.getInputStream();
            // 将输入字节流对象包装成输入字符流对象,并将字符编码为UTF-8格式
            InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "UTF-8");
            // 创建一个输入缓冲区对象,将要输入的字符流对象传入
            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);

            // 创建一个字符串对象,用来接收每次从输入缓冲区中读入的字符串
            String line;
            // 创建一个可变字符串对象,用来装载缓冲区对象的最终数据,使用字符串追加的方式,将响应的所有数据都保存在该对象中
            StringBuilder stringBuilder = new StringBuilder();
            // 使用循环逐行读取缓冲区的数据,每次循环读入一行字符串数据赋值给line字符串变量,直到读取的行为空时标识内容读取结束循环
            while ((line = bufferedReader.readLine()) != null) {
                // 将缓冲区读取到的数据追加到可变字符对象中
                stringBuilder.append(line);
            }
            // 依次关闭打开的输入流
            bufferedReader.close();
            inputStreamReader.close();
            inputStream.close();
            // 依次关闭打开的输出流
            bufferedWriter.close();
            outputStreamWriter.close();
            outputStream.close();
            // 将可变字符串转换成String对象返回
            return stringBuilder.toString();

        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

}

以上示例程序是假设这个一个普通的网页资源,所以将字节流直接包装成字符流进行操作了。如果要上次或者下载文件,就需要将字节流包装成文件流。

记忆要点:
很多初学者对Java的IO流不熟悉,容易对输入输出流搞混了,可使用以下方法记:
所谓的输入和输出,都是针对我们计算机自身而言的,从外部到计算机就是输入。
从计算机到外部就是输出。网络资源在计算机外部,要获取某个网页数据到我们计算机显示就要使用输入流读入,如果要提交某个数据到指定网站,就要使用输出流写出。

  1. 网络通信采用用字节流来传输,不管是发送和接收,Java都提供了将字节流包装成字符流以及其他流的类,使开发人员可以很方便的操作资源。

注意事项:
1.POST请求方式记得要设置URLConnection对象的setDoOutput方法里的值为true,这样我们才可以往输出流中写出我们的参数数据。参数写出完毕后要调用输出缓冲区的flush方法刷新输出缓冲区,将缓冲区的数据输出。
2.打开的输入输出流要记得关闭。

你可能感兴趣的:(URLConnection发送GET和POST请求)