一、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());