【Java】实现后端请求接口
- 【一】使用 HttpURLConnection 实现四种请求方式的示例
- 【1】Get请求
- 【2】POST请求
- 【3】PUT请求
- 【4】DELETE 请求
- 【5】汇总工具类,通过传参实现4种请求
- 【二】HttpClient 实现四种请求方式的示例
- 【1】GET请求
- 【2】POST 请求
- 【3】PUT 请求
- 【4】DELETE 请求
- 【5】汇总的工具类
【一】使用 HttpURLConnection 实现四种请求方式的示例
HttpURLConnection 是 Java 标准库中较早提供的 HTTP 请求工具
【1】Get请求
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;public class HttpGetExample {public static String sendGet(String urlStr) throws Exception {// 对 URL 中的中文参数进行编码String encodedUrl = URLEncoder.encode(urlStr, "UTF-8").replaceAll("\\+", "%20");URL url = new URL(encodedUrl);HttpURLConnection connection = (HttpURLConnection) url.openConnection();connection.setRequestMethod("GET");// 设置请求头,指定接收的字符编码connection.setRequestProperty("Accept-Charset", "UTF-8");int responseCode = connection.getResponseCode();if (responseCode == HttpURLConnection.HTTP_OK) {// 使用 BufferedReader 读取响应内容,并指定字符编码为 UTF-8BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8"));StringBuilder response = new StringBuilder();String line;while ((line = reader.readLine()) != null) {response.append(line);}reader.close();return response.toString();}return null;}public static void main(String[] args) {try {String url = "http://example.com/api?param=中文参数";String response = sendGet(url);System.out.println(response);} catch (Exception e) {e.printStackTrace();}}
}
【2】POST请求
import java.io.DataOutputStream;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;public class HttpPostExample {public static String sendPost(String urlStr, String params) throws Exception {URL url = new URL(urlStr);HttpURLConnection connection = (HttpURLConnection) url.openConnection();connection.setRequestMethod("POST");// 设置请求头,指定字符编码和内容类型connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");connection.setRequestProperty("Accept-Charset", "UTF-8");connection.setDoOutput(true);// 对请求参数进行编码String encodedParams = URLEncoder.encode(params, "UTF-8");DataOutputStream outputStream = new DataOutputStream(connection.getOutputStream());outputStream.writeBytes(encodedParams);outputStream.flush();outputStream.close();int responseCode = connection.getResponseCode();if (responseCode == HttpURLConnection.HTTP_OK) {// 使用 BufferedReader 读取响应内容,并指定字符编码为 UTF-8BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8"));StringBuilder response = new StringBuilder();String line;while ((line = reader.readLine()) != null) {response.append(line);}reader.close();return response.toString();}return null;}public static void main(String[] args) {try {String url = "http://example.com/api";String params = "param=中文参数";String response = sendPost(url, params);System.out.println(response);} catch (Exception e) {e.printStackTrace();}}
}
【3】PUT请求
import java.io.DataOutputStream;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;public class HttpPutExample {public static String sendPut(String urlStr, String params) throws Exception {URL url = new URL(urlStr);HttpURLConnection connection = (HttpURLConnection) url.openConnection();connection.setRequestMethod("PUT");// 设置请求头,指定字符编码和内容类型connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");connection.setRequestProperty("Accept-Charset", "UTF-8");connection.setDoOutput(true);// 对请求参数进行编码String encodedParams = URLEncoder.encode(params, "UTF-8");DataOutputStream outputStream = new DataOutputStream(connection.getOutputStream());outputStream.writeBytes(encodedParams);outputStream.flush();outputStream.close();int responseCode = connection.getResponseCode();if (responseCode == HttpURLConnection.HTTP_OK) {// 使用 BufferedReader 读取响应内容,并指定字符编码为 UTF-8BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8"));StringBuilder response = new StringBuilder();String line;while ((line = reader.readLine()) != null) {response.append(line);}reader.close();return response.toString();}return null;}public static void main(String[] args) {try {String url = "http://example.com/api";String params = "param=中文参数";String response = sendPut(url, params);System.out.println(response);} catch (Exception e) {e.printStackTrace();}}
}
【4】DELETE 请求
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;public class HttpDeleteExample {public static String sendDelete(String urlStr) throws Exception {// 对 URL 中的中文参数进行编码String encodedUrl = URLEncoder.encode(urlStr, "UTF-8").replaceAll("\\+", "%20");URL url = new URL(encodedUrl);HttpURLConnection connection = (HttpURLConnection) url.openConnection();connection.setRequestMethod("DELETE");// 设置请求头,指定接收的字符编码connection.setRequestProperty("Accept-Charset", "UTF-8");int responseCode = connection.getResponseCode();if (responseCode == HttpURLConnection.HTTP_OK) {// 使用 BufferedReader 读取响应内容,并指定字符编码为 UTF-8BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8"));StringBuilder response = new StringBuilder();String line;while ((line = reader.readLine()) != null) {response.append(line);}reader.close();return response.toString();}return null;}public static void main(String[] args) {try {String url = "http://example.com/api?param=中文参数";String response = sendDelete(url);System.out.println(response);} catch (Exception e) {e.printStackTrace();}}
}
【5】汇总工具类,通过传参实现4种请求
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;public class HttpUtils {public static String sendRequest(String urlStr, String method, String params) {try {URL url;if (method.equalsIgnoreCase("GET") || method.equalsIgnoreCase("DELETE")) {if (params != null) {urlStr += "?" + URLEncoder.encode(params, "UTF-8").replaceAll("\\+", "%20");}url = new URL(urlStr);} else {url = new URL(urlStr);}HttpURLConnection connection = (HttpURLConnection) url.openConnection();connection.setRequestMethod(method);// 设置请求头,指定字符编码和接收内容的字符编码connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");connection.setRequestProperty("Accept-Charset", "UTF-8");if (method.equalsIgnoreCase("POST") || method.equalsIgnoreCase("PUT")) {connection.setDoOutput(true);if (params != null) {String encodedParams = URLEncoder.encode(params, "UTF-8");DataOutputStream outputStream = new DataOutputStream(connection.getOutputStream());outputStream.writeBytes(encodedParams);outputStream.flush();outputStream.close();}}int responseCode = connection.getResponseCode();if (responseCode == HttpURLConnection.HTTP_OK) {// 使用 BufferedReader 读取响应内容,并指定字符编码为 UTF-8BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8"));StringBuilder response = new StringBuilder();String line;while ((line = reader.readLine()) != null) {response.append(line);}reader.close();return response.toString();}} catch (Exception e) {e.printStackTrace();}return null;}public static void main(String[] args) {String url = "http://example.com/api";String params = "param=中文参数";String getResponse = sendRequest(url, "GET", params);System.out.println("GET Response: " + getResponse);String postResponse = sendRequest(url, "POST", params);System.out.println("POST Response: " + postResponse);String putResponse = sendRequest(url, "PUT", params);System.out.println("PUT Response: " + putResponse);String deleteResponse = sendRequest(url + "?" + params, "DELETE", null);System.out.println("DELETE Response: " + deleteResponse);}
}
【二】HttpClient 实现四种请求方式的示例
HttpClient 是 Java 11 及以上版本引入的新的 HTTP 客户端,使用起来更加简洁和方便。
【1】GET请求
import java.io.IOException;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;public class HttpClientGetExample {public static void main(String[] args) {try {// 创建 HttpClient 实例HttpClient client = HttpClient.newHttpClient();// 构建 GET 请求,指定请求 URLHttpRequest request = HttpRequest.newBuilder().uri(URI.create("https://example.com/api?param=中文参数")).header("Accept-Charset", "UTF-8") // 设置接收响应的字符编码为 UTF-8.GET().build();// 发送请求并获取响应,指定响应体处理方式为按 UTF-8 编码读取字符串HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());System.out.println("Status code: " + response.statusCode());System.out.println("Response body: " + response.body());} catch (IOException | InterruptedException e) {e.printStackTrace();}}
}
【2】POST 请求
import java.io.IOException;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;public class HttpClientPostExample {public static void main(String[] args) {try {// 构建请求体,对中文参数进行编码String param = URLEncoder.encode("中文参数", StandardCharsets.UTF_8);String requestBody = "param=" + param;// 创建 HttpClient 实例HttpClient client = HttpClient.newHttpClient();// 构建 POST 请求,设置请求头的字符编码和内容类型HttpRequest request = HttpRequest.newBuilder().uri(URI.create("https://example.com/api")).header("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8").header("Accept-Charset", "UTF-8").POST(HttpRequest.BodyPublishers.ofString(requestBody)).build();// 发送请求并获取响应,指定响应体处理方式为按 UTF-8 编码读取字符串HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());System.out.println("Status code: " + response.statusCode());System.out.println("Response body: " + response.body());} catch (IOException | InterruptedException e) {e.printStackTrace();}}
}
【3】PUT 请求
import java.io.IOException;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;public class HttpClientPutExample {public static void main(String[] args) {try {// 构建请求体,对中文参数进行编码String param = URLEncoder.encode("中文参数", StandardCharsets.UTF_8);String requestBody = "param=" + param;// 创建 HttpClient 实例HttpClient client = HttpClient.newHttpClient();// 构建 PUT 请求,设置请求头的字符编码和内容类型HttpRequest request = HttpRequest.newBuilder().uri(URI.create("https://example.com/api")).header("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8").header("Accept-Charset", "UTF-8").PUT(HttpRequest.BodyPublishers.ofString(requestBody)).build();// 发送请求并获取响应,指定响应体处理方式为按 UTF-8 编码读取字符串HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());System.out.println("Status code: " + response.statusCode());System.out.println("Response body: " + response.body());} catch (IOException | InterruptedException e) {e.printStackTrace();}}
}
【4】DELETE 请求
import java.io.IOException;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;public class HttpClientDeleteExample {public static void main(String[] args) {try {// 创建 HttpClient 实例HttpClient client = HttpClient.newHttpClient();// 构建 DELETE 请求,指定请求 URL 和接收响应的字符编码HttpRequest request = HttpRequest.newBuilder().uri(URI.create("https://example.com/api?param=中文参数")).header("Accept-Charset", "UTF-8").DELETE().build();// 发送请求并获取响应,指定响应体处理方式为按 UTF-8 编码读取字符串HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());System.out.println("Status code: " + response.statusCode());System.out.println("Response body: " + response.body());} catch (IOException | InterruptedException e) {e.printStackTrace();}}
}
【5】汇总的工具类
HttpClientUtils 类中的 sendRequest 方法根据传入的 url、method 和 requestBody 构建相应的 HttpRequest 对象并发送请求。对于 GET 和 DELETE 请求,requestBody 可以传入 null;对于 POST 和 PUT 请求,需要传入请求体内容。在 main 方法中演示了如何调用该工具类的方法进行不同类型的请求。
(1)在请求头中设置 Accept-Charset 为 UTF-8,告诉服务器客户端期望接收的字符编码。
(2)对于 POST 和 PUT 请求,使用 URLEncoder 对请求体中的中文参数进行编码,避免发送时出现乱码。
(3)使用 HttpResponse.BodyHandlers.ofString() 接收响应体,默认以 UTF - 8 编码读取字符串。
import java.io.IOException;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;public class HttpClientUtils {private static final HttpClient client = HttpClient.newHttpClient();public static String sendRequest(String url, String method, String requestBody) {try {HttpRequest.Builder requestBuilder = HttpRequest.newBuilder().uri(URI.create(url)).header("Accept-Charset", "UTF-8");switch (method.toUpperCase()) {case "GET":requestBuilder.GET();break;case "POST":if (requestBody != null) {requestBody = URLEncoder.encode(requestBody, StandardCharsets.UTF_8);}requestBuilder.header("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8").POST(HttpRequest.BodyPublishers.ofString(requestBody));break;case "PUT":if (requestBody != null) {requestBody = URLEncoder.encode(requestBody, StandardCharsets.UTF_8);}requestBuilder.header("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8").PUT(HttpRequest.BodyPublishers.ofString(requestBody));break;case "DELETE":requestBuilder.DELETE();break;default:throw new IllegalArgumentException("Unsupported HTTP method: " + method);}HttpRequest request = requestBuilder.build();HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());return response.body();} catch (IOException | InterruptedException | IllegalArgumentException e) {e.printStackTrace();return null;}}public static void main(String[] args) {String getUrl = "https://example.com/api?param=中文参数";String postUrl = "https://example.com/api";String putUrl = "https://example.com/api";String deleteUrl = "https://example.com/api?param=中文参数";String postBody = "param=中文参数";String putBody = "param=中文参数";System.out.println("GET response: " + sendRequest(getUrl, "GET", null));System.out.println("POST response: " + sendRequest(postUrl, "POST", postBody));System.out.println("PUT response: " + sendRequest(putUrl, "PUT", putBody));System.out.println("DELETE response: " + sendRequest(deleteUrl, "DELETE", null));}
}