Spring 使用 header 中的凭据执行命令 HTTP OPTIONS 的引导方式

Spring Boot way of implementing the command HTTP OPTIONS with credentials in header

我是 Spring 引导的新手,但我之前使用过 Java HTTP OPTIONS 命令。

我正在构建一个接受 URL 并使用 HTTP OPTIONS 命令测试 URL 的服务方法。

下面是我用Java写的:

import java.net.HttpURLConnection;
import java.net.URL;

    ...

public String testConnection(URL url) {
    try {
              String type = "text/plain;charset=UTF-8";
              HttpURLConnection conn = (HttpURLConnection) url.openConnection();

              conn.setDoOutput(true);
              conn.setRequestMethod("OPTIONS");
              conn.setRequestProperty("Content-Type", type);

              System.out.println(String.format("HTTP %d: %s",
                    conn.getResponseCode(), conn.getResponseMessage()));

              for(String header : conn.getHeaderFields().keySet() ){
                 System.out.println(String.format("%s : %s",
                       header, conn.getHeaderFields().get(header)));
              }

              String rMessage = conn.getResponseMessage();
              System.out.println ("Response " + rMessage);

           } catch (Exception e) {
              e.printStackTrace();
           }
        }
}

是否有 Spring 启动等效方式来实现 HTTP OPTIONS 请求?如果是这样,我还可以将凭据(用户名和密码)作为请求的一部分添加到 header 吗?谢谢

您可以使用 Spring Boot 的 RestTemplate:

import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;

// skipping class definition here, just showing the method call

private void optionsCall() {
    final String url = "https://some.server/with/some/path";
    final String user = "theUser";
    final String password = "thePassword";

    final String authHeaderValue = "Basic " + Base64.getEncoder()
            .encodeToString((user + ':' + password).getBytes());

    final HttpHeaders requestHeaders = new HttpHeaders();
    requestHeaders.set("Authorization", authHeaderValue);

    RestTemplate rest = new RestTemplate();
    final ResponseEntity<Object> optionsResponse =
            rest.exchange(url, HttpMethod.OPTIONS,
                    new HttpEntity<>(requestHeaders),
                    Object.class);

    optionsResponse.getHeaders().forEach((key, value) -> log.info("{} -> {}", key, value));
}

我在这里使用Object作为响应body类型,通常一个OPTION请求不会return什么的,但不禁止这样做,exchange 方法想要在那里有一个 class。我使用 slf4j 记录器记录 returned headers。针对使用 https 和基本身份验证的服务进行测试。