Home | 简体中文 | 繁体中文 | 杂文 | Github | 知乎专栏 | Facebook | Linkedin | Youtube | 打赏(Donations) | About
知乎专栏

16.3. HttpURLConnection

16.3.1. GET 请求

GET 请求

BufferedReader 方案

			
package cn.netkiller.test;

import lombok.Data;
import lombok.extern.slf4j.Slf4j;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

@Data
@Slf4j
public class Test {


    public static void main(String[] args) throws IOException {

        try {
            // 访问URL地址的
            URL url = new URL("https://www.netkiller.cn/index.html");
            // java.net.HttpURLConnection 网络访问对象
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            // 设置是否向HttpURLConnection输出
            connection.setDoOutput(false);
            // 设置是否从HttpUrlConnection读入
            connection.setDoInput(true);
            // 设置请求方式
            connection.setRequestMethod("GET");
            // 设置是否使用缓存
            connection.setUseCaches(true);
            // 否应该自动执行 HTTP 重定向
            connection.setInstanceFollowRedirects(true);
            // 设置超时时间
            connection.setConnectTimeout(3000);
            // 连接
            connection.connect();
            // 如果返回值正常,数据在网络中是以流的形式得到服务端返回的数据
            String msg = "";
            // 得到响应状态码的返回值
            if (connection.getResponseCode() == 200) { // 正常响应
                // 从流中读取响应信息
                BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
                String line = null;
                while ((line = reader.readLine()) != null) { // 循环从流中读取
                    msg += line + "\n";
                }
                reader.close(); // 关闭流
            }
            // 断开连接,释放资源
            connection.disconnect();

            // 显示响应结果
            System.out.println(msg);
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}		
			
			

ByteArrayOutputStream 方案

			
package cn.netkiller.test;

import io.netty.handler.codec.http.HttpMethod;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;

@Data
@Slf4j
public class Test {


    public static void main(String[] args) throws IOException {

        try {
            // 访问URL地址的
            URL url = new URL("https://www.netkiller.cn/index.html");
            // java.net.HttpURLConnection 网络访问对象
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            // 设置是否向HttpURLConnection输出
            connection.setDoOutput(false);
            // 设置是否从HttpUrlConnection读入
            connection.setDoInput(true);
            // 设置请求方式
            connection.setRequestMethod(HttpMethod.GET.name());
            // 设置是否使用缓存
            connection.setUseCaches(true);
            // 否应该自动执行 HTTP 重定向
            connection.setInstanceFollowRedirects(true);
            // 设置超时时间
            connection.setConnectTimeout(3000);
            connection.setReadTimeout(60000);
            // 连接
            connection.connect();
            // 如果返回值正常,数据在网络中是以流的形式得到服务端返回的数据
            String msg = "";

            // 定义一个临时字节输出流
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            // 得到响应状态码的返回值
            if (connection.getResponseCode() == 200) { // 正常响应
                // 获取输入流
                InputStream inputStream = connection.getInputStream();
                try {
                    // 开始读取数据
                    byte[] buffer = new byte[256];
                    int len = 0;
                    while ((len = inputStream.read(buffer)) > 0) {
                        baos.write(buffer, 0, len);
                    }
                    msg = baos.toString(StandardCharsets.UTF_8);
                } finally {
                    // 关闭输入、输出流
                    inputStream.close();
                    baos.close();
                }

            }
            // 断开连接,释放资源
            connection.disconnect();

            // 显示响应结果
            System.out.println(msg);
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
	}		
			
			

16.3.2. POST 请求

			
package cn.netkiller.test;

import lombok.Data;
import lombok.extern.slf4j.Slf4j;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

@Data
@Slf4j
public class Test {


    public static void main(String[] args) throws IOException {

        try {
            // 获取访问URL地址
            URL url = new URL("https://www.netkiller.cn/test/");
            // 创建HttpURLConnection对象
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            // POST 请求方式
            connection.setRequestMethod("POST");
            // 设置连接超时时间
            connection.setConnectTimeout(3000);
            // 设置是否向 HttpUrlConnection 输出,对于post请求,参数要放在 http 正文内,因此需要设为true,默认为false。
            connection.setDoOutput(true);
            // 设置是否从 HttpUrlConnection读入,默认为true
            connection.setDoInput(true);
            // 设置是否使用缓存
            connection.setUseCaches(false);
            // 设置此 HttpURLConnection 实例是否应该自动执行 HTTP 重定向
            connection.setInstanceFollowRedirects(true);
            // 设置使用标准编码 application/x-www-form-urlencoded 格式参数编码
            connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
            // 添加 HTTP HEAD 中的一些参数。
            connection.setRequestProperty("Connection", "Keep-Alive");
            // 连接
            connection.connect();
            // POST 参数
            String params = "username=neo&password=netkiller";
            OutputStream out = connection.getOutputStream();
            out.write(params.getBytes());
            out.flush();
            out.close();
            // 从连接中读取响应信息
            String msg = "";
            int code = connection.getResponseCode();
            if (code == 200) {
                BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
                String line;
                while ((line = reader.readLine()) != null) {
                    msg += line + "\n";
                }
                reader.close();
            }
            // 断开连接
            connection.disconnect();

            // 处理结果
            System.out.println(msg);
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}			
			
			

16.3.3. POST JSON

			
package cn.netkiller.test;

import lombok.Data;
import lombok.extern.slf4j.Slf4j;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

@Data
@Slf4j
public class Test {
    
    public static void main(String[] args) throws IOException {

        try {
            // 获取访问URL地址
            URL url = new URL("https://www.netkiller.cn/test/");
            // 创建HttpURLConnection对象
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            // POST 请求方式
            connection.setRequestMethod("POST");
            // 设置连接超时时间
            connection.setConnectTimeout(3000);
            // 设置是否向 HttpUrlConnection 输出,对于post请求,参数要放在 http 正文内,因此需要设为true,默认为false。
            connection.setDoOutput(true);
            // 设置是否从 HttpUrlConnection读入,默认为true
            connection.setDoInput(true);
            // 设置是否使用缓存
            connection.setUseCaches(false);
            // 设置此 HttpURLConnection 实例是否应该自动执行 HTTP 重定向
            connection.setInstanceFollowRedirects(true);
            // 设置使用 JSON 编码 application/json 格式参数编码
            connection.setRequestProperty("Content-Type", "application/json");
            // 添加 HTTP HEAD 中的一些参数。
            connection.setRequestProperty("Connection", "Keep-Alive");
            // 连接
            connection.connect();
            // POST 参数
            String jsonString = "{}";
            OutputStream out = connection.getOutputStream();
            out.write(jsonString.getBytes());
            out.flush();
            out.close();
            // 从连接中读取响应信息
            String msg = "";
            int code = connection.getResponseCode();
            if (code == 200) {
                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(connection.getInputStream()));

                String line;
                while ((line = bufferedReader.readLine()) != null) {
                    msg += line + "\n";
                }
                bufferedReader.close();
            }
            // 断开连接
            connection.disconnect();

            // 处理结果
            System.out.println(msg);
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}