您的位置:

Java HTTP调用详解

一、HTTP协议

HTTP协议全称是超文本传输协议,是一种应用层协议,是客户端和服务器之间进行数据传输的标准协议,也是Internet上应用最为广泛的一种网络协议。HTTP通常基于TCP/IP协议来传输数据。

HTTP协议的主要特点包括:

1、支持客户/服务器模式

2、简单快速

3、灵活

4、无连接

5、无状态

HTTP协议的主要方法包括GET、POST、PUT、DELETE、HEAD等。

二、Java HTTP调用方式

1. 使用Java内置的HttpURLConnection

HttpURLConnection是Java内置的一个HTTP客户端,可以用它来发送HTTP/HTTPS请求,接收响应结果。下面是一个简单的HttpURLConnection示例:

URL url = new URL("https://www.example.com/api/test");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setRequestProperty("Content-Type", "application/json");

BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();

while ((inputLine = in.readLine()) != null) {
    response.append(inputLine);
}
in.close();

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

2. 使用第三方库Apache HttpComponents

Apache HttpComponents是一个用Java语言编写的HTTP客户端库,它是Apache的顶级项目之一。它包含两个组件:HttpCore和HttpClient。其中HttpCore是一个HTTP协议处理库,HttpClient是一个HTTP客户端库。

下面是使用HttpClient进行GET请求的示例:

CloseableHttpClient httpclient = HttpClients.createDefault();
HttpGet httpGet = new HttpGet("https://www.example.com/api/test");
CloseableHttpResponse response = httpclient.execute(httpGet);

try {
    HttpEntity entity = response.getEntity();
    if (entity != null) {
        System.out.println(EntityUtils.toString(entity));
    }
} finally {
    response.close();
}

3. 使用第三方库OkHttp

OkHttp是一个开源的HTTP客户端库,它支持HTTP/2协议。它的主要特点包括:流式API、GZIP压缩、缓存响应、支持异步和同步调用等。

下面是使用OkHttp进行GET请求的示例:

OkHttpClient client = new OkHttpClient();

Request request = new Request.Builder()
  .url("https://www.example.com/api/test")
  .build();

Response response = client.newCall(request).execute();
System.out.println(response.body().string());

三、HTTP调用中的异常处理

在进行HTTP调用时,可能会发生一些异常情况。常见的异常情况包括:连接超时、读写超时、连接被拒绝、请求被取消等。

为了正确处理这些异常情况,我们可以使用try-catch语句块来进行捕获和处理。

下面是一个使用HttpURLConnection时的异常处理示例:

URL url = new URL("https://www.example.com/api/test");
HttpURLConnection conn = null;
try {
    conn = (HttpURLConnection) url.openConnection();
    conn.setRequestMethod("GET");
    conn.setRequestProperty("Content-Type", "application/json");

    BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
    String inputLine;
    StringBuffer response = new StringBuffer();

    while ((inputLine = in.readLine()) != null) {
        response.append(inputLine);
    }
    in.close();

    System.out.println(response.toString());
} catch (IOException e) {
    e.printStackTrace();
} finally {
    if (conn != null) {
        conn.disconnect();
    }
}

四、HTTP请求参数处理

在进行HTTP请求时,可能需要携带一些参数。通常有两种方式可以携带参数:查询字符串和请求正文。

1. 查询字符串

查询字符串是一种常见的参数传递方式,它出现在URL的最后,以问号(?)开始,参数名和参数值之间以等号(=)连接,多个参数之间以&符号连接。

下面是一个使用查询字符串携带参数的GET请求示例:

URL url = new URL("https://www.example.com/api/test?name=value&age=20");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");

BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();

while ((inputLine = in.readLine()) != null) {
    response.append(inputLine);
}
in.close();

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

2. 请求正文

请求正文是一种更为灵活的参数传递方式,通常用于POST请求中。其格式可以是XML、JSON等。在Java中可以使用第三方库如Gson来将参数对象序列化成JSON字符串。

下面是一个使用请求正文携带参数的POST请求示例:

URL url = new URL("https://www.example.com/api/test");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "application/json");

String inputJson = "{name:value}";
OutputStream os = conn.getOutputStream();
os.write(inputJson.getBytes());
os.flush();

BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();

while ((inputLine = in.readLine()) != null) {
    response.append(inputLine);
}
in.close();

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

五、HTTPS请求处理

HTTPS是基于HTTP协议的加密传输协议,它使用TLS/SSL协议加密通讯内容,确保数据传输的安全性。

在Java中,可以使用HttpURLConnection、HttpClient、OkHttp等客户端库进行HTTPS请求。下面是一个使用HttpURLConnection进行HTTPS请求的示例:

URL url = new URL("https://www.example.com/api/test");
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setRequestProperty("Content-Type", "application/json");

InputStream is = conn.getInputStream();
BufferedReader in = new BufferedReader(new InputStreamReader(is));
String inputLine;
StringBuffer response = new StringBuffer();

while ((inputLine = in.readLine()) != null) {
    response.append(inputLine);
}
in.close();

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

六、HTTP请求头处理

HTTP请求头是指在HTTP请求中携带的一些元数据。可以在请求头中指定一些请求参数、请求类型、请求来源等信息。

可以使用Java内置的HttpURLConnection类或第三方库如Apache Http、OkHttp等来设置HTTP请求头。下面是一个使用HttpURLConnection设置HTTP请求头的示例:

URL url = new URL("https://www.example.com/api/test");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setRequestProperty("Content-Type", "application/json");
conn.setRequestProperty("Authorization", "Bearer token");

BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();

while ((inputLine = in.readLine()) != null) {
    response.append(inputLine);
}
in.close();

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

七、HTTP响应处理

HTTP响应是服务器返回给客户端的一些元数据和数据。客户端需要对响应进行处理,从中提取需要的信息。

可以使用Java内置的HttpURLConnection类或第三方库如Apache Http、OkHttp等来处理HTTP响应。下面是一个使用HttpURLConnection处理HTTP响应的示例:

URL url = new URL("https://www.example.com/api/test");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setRequestProperty("Content-Type", "application/json");

int responseCode = conn.getResponseCode();
System.out.println("Response Code : " + responseCode);

BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();

while ((inputLine = in.readLine()) != null) {
    response.append(inputLine);
}
in.close();

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