根据basic auth请求https获取token

根据basic auth请求https获取token


对接第三方接口,给了接口文档,但是没有示例代码,postman一直可请求成功,java就是不行。百思不得其解,最后请求公司大神,得到一套秘籍。

第一步

在这里插入图片描述
第二步
在这里插入图片描述
Authorization:Bearer access_token。其中,Bearer为固定字符串,后面包含一个空格,access_token表示实际获取到的token。

第三步:写出代码。


import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.spcp.platform.common.util.StringUtil;
import org.apache.http.conn.ssl.NoopHostnameVerifier;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.conn.ssl.TrustStrategy;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.ssl.SSLContexts;
import org.springframework.http.*;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;

import javax.net.ssl.SSLContext;
import java.security.KeyManagementException;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

public String getToken() {
        String token = "";
        try {
            TrustStrategy acceptingTrustStrategy = (x509Certificates, authType) -> true;
            SSLContext sslContext = SSLContexts.custom()
                    .loadTrustMaterial(null, acceptingTrustStrategy)
                    .build();
            SSLConnectionSocketFactory sslFactory = new SSLConnectionSocketFactory(
                    sslContext, new NoopHostnameVerifier());

            CloseableHttpClient httpClient = HttpClients.custom()
                    .setSSLSocketFactory(sslFactory)
                    .build();

            HttpComponentsClientHttpRequestFactory factory =
                    new HttpComponentsClientHttpRequestFactory();
            factory.setConnectTimeout(3600000);
            factory.setReadTimeout(3600000);

            factory.setHttpClient(httpClient);
            RestTemplate restTemplate = new RestTemplate(factory);
            // 要请求的URL
            String requestUrl = "https://110:39/oauth/token?grant_type=client_credentials";
            // header根据实际情况设置,没有就空着
            MultiValueMap<String, String> params = new HttpHeaders();
            params.add("grant_type", "client_credentials-aqjc");
            HttpHeaders headers = new HttpHeaders();
            // 加密后的用户名和密码,这个替换成加密后的
            headers.add("Authorization", "Basic d2666666666666==");
            //headers.add("Content-Type", "application/x-www-form-urlencoded");
            HttpEntity<?> requestEntity = new HttpEntity<>(params, headers);
            // 发送请求并接收响应
            ResponseEntity<String> response = restTemplate.exchange(requestUrl, HttpMethod.POST, requestEntity, String.class);
            // 获取响应体
            String responseBody = response.getBody();
            // 输出响应体内容
            Map<String, String> resMap = new ObjectMapper().readValue(responseBody, new TypeReference<Map<String, String>>() {
            });
            token = resMap.get("access_token");
        } catch (Exception e) {
            e.printStackTrace();
        }
        return token;
    }

总结:其实挺难的,尤其https认证。

你可以使用 Java 中的 HttpURLConnection 类来发送 HTTPS 请求,并在请求中添加 Header。 下面是一个示例代码,其中我们使用 Base64 编码来将账号和密码组成的字符串转换为 Authorization Header 中的值。 ```java import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.util.Base64; public class HttpsRequestExample { public static void main(String[] args) throws IOException { String username = "your_username"; String password = "your_password"; // create URL URL url = new URL("https://example.com/api"); // create connection HttpURLConnection connection = (HttpURLConnection) url.openConnection(); // set request method connection.setRequestMethod("GET"); // set authorization header String auth = username + ":" + password; byte[] encodedAuth = Base64.getEncoder().encode(auth.getBytes()); String authHeaderValue = "Basic " + new String(encodedAuth); connection.setRequestProperty("Authorization", authHeaderValue); // send request int responseCode = connection.getResponseCode(); // read response BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream())); String inputLine; StringBuilder response = new StringBuilder(); while ((inputLine = in.readLine()) != null) { response.append(inputLine); } in.close(); // print response System.out.println("Response code: " + responseCode); System.out.println("Response body: " + response.toString()); } } ``` 在上面的代码中,你需要替换掉 `your_username` 和 `your_password` 为你自己的账号和密码。然后你就可以使用 `connection.setRequestProperty` 方法来添加任意的 Header。 请注意,上述示例中的请求方法是 GET,你可以根据你的需要更改为 POST 或其他 HTTP 方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值