在Java中获取URL指向的资源信息
#编程 #发展 #java #networking

在这篇文章中,我们将知道如何在Java中提出HTTP请求。我们将看到两种方式-1。Java 11和2之前。

让我们首先看看如何在Java 11之前提出HTTP请求。在这里,我们将检索由和URL指向的文件的各种元数据信息。

package org.gaurav;

import java.io.IOException;
import java.net.*;
import java.util.List;
import java.util.Map;

public class Main {
    public static void main(String[] args) {
        String url1 = "https://resources.docs.salesforce.com/latest/latest/en-us/sfdc/pdf/salesforce_useful_validation_formulas.pdf";
        String url2 = "https://fastly.picsum.photos/id/112/600/600.jpg?hmac=hakYJ0LrbvOQ1fnbvBGE1ThGxufcyCWKNAfXrctqyWQ";
        String url3 = "https://picsum.photos/200/300";

        System.out.println("First URL Information");
        printHeaders(url1);

        System.out.println();
        System.out.println("Second URL Information");
        printHeaders(url2);

        System.out.println();
        System.out.println("Third URL Information");
        printHeaders(url3);
    }

    public static void printHeaders(String fileUrl) {
        try {
            URL url = new URI(fileUrl).toURL();
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            Map<String, List<String>> headers = connection.getHeaderFields();

            for (Map.Entry<String, java.util.List<String>> entry : headers.entrySet()) {
                System.out.println(entry.getKey() + ": " + entry.getValue());
            }

            connection.disconnect();
        } catch (IOException | URISyntaxException e) {
            e.printStackTrace();
        }
    }
}

运行上述代码以查看输出。

现在,让我们看看如何使用 http client api 在Java 11中引入的事情。

package org.gaurav;

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.util.List;
import java.util.Map;

public class Main {
    public static void main(String[] args) {
        String url1 = "https://resources.docs.salesforce.com/latest/latest/en-us/sfdc/pdf/salesforce_useful_validation_formulas.pdf";
        String url2 = "https://fastly.picsum.photos/id/112/600/600.jpg?hmac=hakYJ0LrbvOQ1fnbvBGE1ThGxufcyCWKNAfXrctqyWQ";
        String url3 = "https://picsum.photos/200/300";

        System.out.println("First URL Information");
        printHeaders(url1);

        System.out.println();
        System.out.println("Second URL Information");
        printHeaders(url2);

        System.out.println();
        System.out.println("Third URL Information");
        printHeaders(url3);
    }

    public static void printHeaders(String fileUrl) {
        HttpClient httpClient = HttpClient.newHttpClient();
        HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create(fileUrl))
                .build();

        try {
            HttpResponse<Void> response = httpClient.send(request, HttpResponse.BodyHandlers.discarding());
            Map<String, List<String>> headers = response.headers().map();
            for (Map.Entry<String, List<String>> entry : headers.entrySet()) {
                System.out.println(entry.getKey() + ": " + entry.getValue());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

现在让我们讨论为什么要使用较新的原因?

以下是这些新替代方案的一些原因:

  1. 灵活性和易用性: apache httpclient和java.net.http.httpclient等库提供了更直观的API,用于做出HTTP请求和处理响应。他们提供了更高级别的抽象,并为现代HTTP功能提供更好的支持。

  2. 性能:新库的设计考虑了现代性能考虑,包括更好的连接池和异步功能。

  3. 标准化:java.net.http.httpclient是从Java 11开始的Java SE平台的一部分,这意味着它是Java生态系统的标准化部分。

  4. 功能编程:新库通常利用功能编程功能在处理异步操作时提供更简洁和表达的代码。

注意: httpurlConnection仍然可以用于基本场景,诸如Apache HttpClient和Java.net.http.httpclient之类的较新库,提供更好的性能,改进的功能,以及更直观的API,用于制作HTTPP的API请求并处理响应。在现代Java应用中与HTTP合作时,最好考虑这些选择。