JAVA基础 - Http&&Https

发布于:2024-08-01 ⋅ 阅读:(163) ⋅ 点赞:(0)

目录

一. URL

二. javaURL用法

三. Http

四. Https



一. URL

URL 是用于在网络上定位和访问资源的地址。它具有特定的格式和组成部分,以便准确地指向所需的资源。

组成部分

  1. 协议(Protocol):指定用于访问资源的方法,如 http(超文本传输协议)、https(安全的超文本传输协议)、ftp(文件传输协议)等。
  2. 域名或 IP 地址(Domain Name or IP Address):标识资源所在的服务器。
  3. 端口(Port):如果使用的是非标准端口,则需要指定。例如,http 的默认端口是 80,https 的默认端口是 443,如果使用的不是默认端口,则需要在 URL 中明确指定,如 http://example.com:8080 。
  4. 路径(Path):服务器上资源的具体位置。
  5. 查询字符串(Query String):以 ? 开头,后跟键值对形式的参数,用于向服务器传递额外的信息,例如 ?key1=value1&key2=value2 。
  6. 片段标识符(Fragment Identifier):以 # 开头,用于在页面内定位特定的部分。

示例https://www.example.com/path/to/page?param1=value1#section

  • https 是协议。
  • www.example.com 是域名。
  • /path/to/page 是路径。
  • ?param1=value1 是查询字符串。
  • #section 是片段标识符。

作用

  1. 资源定位:准确找到网络上的各种资源,如网页、文件、图像等。
  2. 信息传递:通过查询字符串向服务器传递参数,以获取特定的内容或执行特定的操作。

注意事项

  1. 格式准确性:必须符合 URL 的规范格式,否则可能无法正确访问资源。
  2. 编码问题:某些特殊字符需要进行编码,例如空格通常编码为 %20 。
  3. 安全性:在处理用户输入的 URL 时,要注意防范恶意输入,以避免安全漏洞。

二. javaURL用法

在 Java 中,URL类用于表示统一资源定位符(Uniform Resource Locator),它是指向互联网“资源”的指针。资源可以是简单的文件或目录,也可以是对更为复杂的对象的引用,例如域名、浏览器访问地址等。通过URL类可以访问网络资源,并获取URL对象的相关信息。

构造函数

  • URL(String spec):从字符串表示形式创建URL对象。可能抛出MalformedURLException异常,需要进行异常处理。
  • URL(String protocol, String host, int port, String file):根据指定的协议、主机、端口号和文件创建URL对象。
  • URL(String protocol, String host, String file):从指定的协议名称、主机名称和文件名称创建一个URL
  • URL(URL context, String spec):通过在指定的上下文中解析给定的规范来创建一个URL
  • URL(URL context, String spec, URLStreamHandler handler):通过在指定上下文中使用指定的处理程序解析给定规范来创建URL

方法

  • boolean equals(Object obj):将此URL与其他对象进行比较。
  • String getAuthority():获取此URL的授权部分。
  • Object getContent():获取此URL的内容。
  • Object getContent(Class<?>[] classes):获取此URL的内容。
  • int getDefaultPort():获取与此URL的协议的默认端口号。
  • String getFile():获取此URL的文件名。
  • String getHost():获取此URL的主机名(如适用)。
  • String getPath():获取此URL的路径部分。
  • int getPort():获取此URL的端口号。
  • String getProtocol():获取此URL的协议名称。
  • String getQuery():获取此URL的查询部分。
  • String getRef():获取此URL的锚定(也称为“参考”)部分。
  • String getUserInfo():获取该URL的用户信息部分。
  • int hashCode():创建适合哈希表索引的整数。
  • URLConnection openConnection():返回一个URLConnection实例,表示与URL引用的远程对象的连接。
  • URLConnection openConnection(Proxy proxy):与openConnection()相同,但连接将通过指定的代理进行;不支持代理的协议处理程序将忽略代理参数并进行正常连接。
  • InputStream openStream():打开与此URL的连接,并返回一个InputStream,以便从该连接读取。
  • boolean sameFile(URL other):比较两个URL,不包括片段组件。
  • static void setURLStreamHandlerFactory(URLStreamHandlerFactory fac):设置应用程序的URLStreamHandlerFactory
  • String toExternalForm():构造这个URL的字符串表示形式。
  • String toString():构造此URL的字符串表示形式。
  • URI toURI():返回相当于此URLURI

使用示例
以下是一个简单的示例,演示如何使用URL类获取网页数据:

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

public class URLTest {
    // 获取网页数据
    static void getFromUrl1(String url) {
        try {
            URL u = new URL(url);
            URLConnection uc = u.openConnection();
            InputStream in = uc.getInputStream();
            byte[] b = new byte[1024];
            int len;
            while ((len = in.read(b))!= -1) {
                System.out.println(new String(b, 0, len));
            }
            in.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // 另一种获取网页数据的方式
    static void getFromUrl2(String url) {
        URL u = null;
        BufferedReader in = null;
        try {
            u = new URL(url);
            in = new BufferedReader(new InputStreamReader(u.openStream(), "utf-8"));
            String str;
            while ((str = in.readLine())!= null) {
                System.out.println(str);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (in!= null) {
                try {
                    in.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public static void main(String[] args) {
        String url = "https://www.example.com"; 
        getFromUrl1(url); 
        getFromUrl2(url); 
    }
}

在上述示例中,getFromUrl1方法和getFromUrl2方法都用于从指定的URL获取网页数据并输出到控制台。

使用URL类时需要注意处理可能抛出的MalformedURLException异常,它表示构造的URL格式不正确。另外,URL类本身不会根据 RFC 2396 中定义的转义机制对任何URL组件进行编码或解码,调用者需要负责编码需要转义的字段,并对从URL返回的转义字段进行解码。

为了管理URL的编码和解码,推荐使用URI类,并使用toURI()URI.toURL()方法在URLURI之间进行转换。也可以使用URLEncoderURLDecoder类,但仅适用于与 RFC 2396 中定义的编码方案不同的 HTML 表单编码。

同时,还需要注意网络请求的相关限制和安全性问题,例如,某些网站可能不允许未经授权的访问,或者请求过于频繁可能会被服务器拒绝或封禁。在实际应用中,需要根据具体情况进行适当的错误处理和优化。

三. Http

HTTP 是一种用于在网络上传输数据的应用层协议,主要用于客户端(如浏览器)和服务器之间的通信。

工作原理
客户端向服务器发送一个 HTTP 请求,服务器接收到请求后进行处理,并返回一个 HTTP 响应给客户端。

HTTP 请求
由三部分组成:请求行、请求头和请求体。

  1. 请求行:包括请求方法(如 GET、POST、PUT、DELETE 等)、请求的 URL 和 HTTP 版本。
    • GET 方法用于从服务器获取资源。
    • POST 方法用于向服务器提交数据。
  2. 请求头:包含关于请求的各种附加信息,如客户端支持的内容类型、语言、缓存控制等。
  3. 请求体:在 POST 等方法中,用于携带要提交给服务器的数据。

HTTP 响应
也由三部分组成:状态行、响应头和响应体。

  1. 状态行:包含 HTTP 版本、状态码和状态消息。
    • 常见的状态码如 200(成功)、404(未找到)、500(服务器内部错误)等。
  2. 响应头:包含关于响应的各种信息,如服务器类型、内容类型、长度等。
  3. 响应体:包含服务器返回给客户端的实际数据,如网页的 HTML 代码、图片数据等。

HTTP 特点

  1. 无状态:服务器不会记住之前与客户端的通信状态。
  2. 基于文本:请求和响应都是以文本形式进行传输的。
  3. 支持多种数据类型:可以传输 HTML、JSON、XML、图片、视频等各种类型的数据。

HTTP 版本

  1. HTTP/1.0:早期版本,每次请求都需要建立新的连接。
  2. HTTP/1.1:引入了持久连接,允许在一个连接上发送多个请求和响应。
  3. HTTP/2:采用二进制格式传输,提高了性能和效率。

HTTP 与 HTTPS
HTTPS 是在 HTTP 的基础上通过 SSL/TLS 协议进行加密传输,以保证数据的安全性和完整性。

应用场景

  1. 网页浏览:浏览器通过 HTTP 从服务器获取网页内容。
  2. API 接口:后端服务通过 HTTP 为前端或其他应用提供数据接口。

例如,当您在浏览器中输入一个网址时,浏览器会向服务器发送一个 HTTP GET 请求,服务器处理后返回一个包含网页内容的 HTTP 响应,浏览器再将其渲染展示给用户。

在 Java 中,可以使用多种方式来处理 HTTP 通信。以下是一些常见的方法和库:

HttpURLConnection 类

这是 Java 标准库提供的用于发送 HTTP 请求和接收响应的类。

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

public class HttpURLConnectionExample {
    public static void main(String[] args) {
        try {
            URL url = new URL("https://www.example.com");
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("GET");

            int responseCode = connection.getResponseCode();

            if (responseCode == HttpURLConnection.HTTP_OK) {
                BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
                String inputLine;
                StringBuilder response = new StringBuilder();

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

                System.out.println(response.toString());
            } else {
                System.out.println("Error: " + responseCode);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Apache HttpClient 库

这是一个功能强大的第三方 HTTP 客户端库。

首先,需要在项目中添加依赖:

<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.5.13</version>
</dependency>

然后可以使用如下代码:

import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;

public class ApacheHttpClientExample {
    public static void main(String[] args) {
        try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
            HttpGet httpGet = new HttpGet("https://www.example.com");
            try (CloseableHttpResponse response = httpClient.execute(httpGet)) {
                HttpEntity entity = response.getEntity();
                String responseString = EntityUtils.toString(entity);
                System.out.println(responseString);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Spring Framework 的 RestTemplate

如果在使用 Spring 框架,可以使用 RestTemplate 来处理 HTTP 请求。

首先需要配置好 Spring 环境,然后:

import org.springframework.web.client.RestTemplate;

public class SpringRestTemplateExample {
    public static void main(String[] args) {
        RestTemplate restTemplate = new RestTemplate();
        String result = restTemplate.getForObject("https://www.example.com", String.class);
        System.out.println(result);
    }
}

这些是在 Java 中处理 HTTP 通信的一些常见方式,具体选择哪种方式取决于项目的需求和架构。

四. Https

HTTPS 是 HTTP(超文本传输协议)的安全版本,用于在客户端(如浏览器)和服务器之间进行安全的通信。

工作原理

HTTPS 结合了 HTTP 协议与 SSL/TLS(安全套接层/传输层安全)协议。

  1. 客户端向服务器发送连接请求。
  2. 服务器向客户端返回其数字证书,包含服务器的公钥等信息。
  3. 客户端验证证书的合法性,包括证书是否由受信任的证书颁发机构颁发、证书是否过期等。
  4. 如果证书验证通过,客户端生成一个随机的对称密钥,并使用服务器的公钥对其进行加密,然后发送给服务器。
  5. 服务器使用其私钥解密得到对称密钥。
  6. 此后,客户端和服务器使用这个对称密钥对传输的数据进行加密和解密,保证通信内容的机密性和完整性。

优势

  1. 数据加密:对传输的数据进行加密,防止数据被窃听和篡改。
  2. 身份验证:通过验证服务器的数字证书,确保连接到的是合法的服务器,而不是冒充的恶意服务器。
  3. 完整性保护:确保数据在传输过程中没有被修改。

数字证书

数字证书是由证书颁发机构(CA)颁发的电子文件,包含了服务器的身份信息和公钥。常见的证书类型包括域名验证(DV)、组织验证(OV)和扩展验证(EV)。

加密算法

HTTPS 通常使用对称加密算法(如 AES)对通信数据进行加密,使用非对称加密算法(如 RSA)来交换对称密钥。

应用场景

  1. 电子商务网站:保护用户的支付信息和个人数据。
  2. 网上银行:确保金融交易的安全。
  3. 社交媒体:保护用户的隐私和通信内容。

例如,当您在网上进行购物并输入信用卡信息时,HTTPS 确保这些敏感信息在传输过程中不被窃取或篡改,保障您的财产安全。

使用HttpURLConnection

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

public class HttpUrlConnectionExample {
    public static void main(String[] args) {
        try {
            URL url = new URL("http://example.com");
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("GET");

            int responseCode = connection.getResponseCode();

            if (responseCode == HttpURLConnection.HTTP_OK) {
                BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
                String inputLine;
                StringBuilder response = new StringBuilder();

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

                System.out.println(response.toString());
            } else {
                System.out.println("Error: " + responseCode);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

使用HttpClient库(如 Apache HttpClient)

首先,在项目中添加Apache HttpClient的依赖:

<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.5.13</version>
</dependency>

然后使用以下代码:

import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;

public class ApacheHttpClientExample {
    public static void main(String[] args) {
        try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
            HttpGet httpGet = new HttpGet("http://example.com");
            try (CloseableHttpResponse response = httpClient.execute(httpGet)) {
                HttpEntity entity = response.getEntity();
                String responseString = EntityUtils.toString(entity);
                System.out.println(responseString);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

这些示例展示了在 Java 中如何发送 HTTP GET 请求并获取响应内容。根据具体需求,还可以进行更复杂的请求设置,如添加请求头、发送 POST 请求、处理请求参数等。