【问题标题】:Can I use Spring Boot to make requests using someone elses API?我可以使用 Spring Boot 使用别人的 API 发出请求吗?
【发布时间】:2019-08-29 14:50:23
【问题描述】:

我是 Spring 新手,我正在努力理解它。我可以使用 Spring boot 调用别人的 api 吗?例如,我使用的 api 需要使用他们给我的凭据进行身份验证。我想使用他们的 API 来发出 POST 请求。到目前为止,我已经找到了与使用您自己的 API 相关的文档。这些请求也需要传递标头。

我可以做一个 POST 请求的最简单方法是什么,使用 Spring 传递我的凭据和所需的标头?

任何帮助将不胜感激。

【问题讨论】:

  • 只需在你的应用中使用一些 HTTP 客户端来执行请求......它与 Spring 无关(只有当你想使用 RestTemplate 时才可能)
  • @michalk 是的,我想使用 RestTemplate。我听说 Spring 让事情变得更容易,是这样吗?

标签: java spring rest api


【解决方案1】:

如果我很了解你,你需要发布另一个带有凭据的 web-api,你可以使用

  • restTemplate 类似下面的例子
 public List<EtisAccount> getAllActiveAccount(){
        logger.debug("Debug: in Class \t"+this.getClass().getName()+" Method Name is: \t"+new Object() {}.getClass().getEnclosingMethod().getName());
        Properties sprinklrProp=sprinklrProperties.getSprinklrKeys();
        SprinklrCredential sprinklrCredential=credentialBuilder.getSprinklrCredential();
        RestTemplate restTemplate= new RestTemplate();
        HttpHeaders header = new HttpHeaders();
        header.setBearerAuth(sprinklrCredential.getAccess_token());
        header.add("key", sprinklrCredential.getApi_key());
        header.set("Accept", MediaType.APPLICATION_JSON_UTF8_VALUE);
        UriComponentsBuilder uriBuilder= UriComponentsBuilder.fromUriString(sprinklrProp.getProperty("sprinlrUri").toString())
                .queryParam("types", sprinklrProp.getProperty("accountTypes").toString());
        HttpEntity<String> entity= new HttpEntity<>(header);
        sslCertificateValidation.disable();
        ResponseEntity<String> sprinklrResponse=restTemplate.exchange(uriBuilder.toUriString(),HttpMethod.GET,entity,  String.class);
        List<EtisAccount> activeAccouts=etisAccountHelper.getAllSocialEtisAccounts(sprinklrResponse.getBody());
        logger.debug(String.valueOf(sprinklrResponse.getStatusCodeValue()));
        logger.debug(activeAccouts.toString());
        return activeAccouts;
    }

这是使用 RestTemplate 调用在线 API 的示例

这里我用凭据(不记名身份验证)构建标头

        HttpHeaders header = new HttpHeaders();
        header.setBearerAuth(sprinklrCredential.getAccess_token());
        header.add("key", sprinklrCredential.getApi_key());
        header.set("Accept", MediaType.APPLICATION_JSON_UTF8_VALUE);

在这里我添加标头requestEntity以添加到resttemplate请求

     HttpEntity<String> entity= new HttpEntity<>(header);

在这里我使用交换方法得到响应

   ResponseEntity<String> sprinklrResponse=restTemplate.exchange(uriBuilder.toUriString(),HttpMethod.POST,entity,  String.class);

【讨论】:

    【解决方案2】:

    你需要以下东西:

    1. https://start.spring.io/创建一个Spring web starter项目
    2. 在您的项目中创建一个新的 Java 类并将其命名为 Controller。在类级别添加@RestController 注释。
    3. 在SpringBootApplication中配置RestTemplate对象
    4. Controller 类中自动装配RestTemplate 对象
    5. Controller 类中创建一个使用RestTemplate 的方法,将调用@PostMapping 到他们的API。

    【讨论】:

      【解决方案3】:
      • 你可以试试这个方法
      • 这是最简单的方法
      • 您可以将用户名和密码设置为基本身份验证
        public class RESTInvoker {
              private final String baseUrl;
              private final String username;
              private final String password;
      
              public RESTInvoker(String baseUrl, String username, String password) {
                  this.baseUrl = baseUrl;
                  this.username = username;
                  this.password = password;
              }
      
      
      
              String getDataFromServer(String path) {
                  StringBuilder sb = new StringBuilder();
                  try {
                      URL url = new URL(baseUrl + path);
                      URLConnection urlConnection = setUsernamePassword(url);
                      BufferedReader reader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
                      String line;
                      while ((line = reader.readLine()) != null) {
                          sb.append(line);
                      }
                      reader.close();
      
                      return sb.toString();
                  } catch (Exception e) {
                      throw new RuntimeException(e);
                  }
              }
      
              private URLConnection setUsernamePassword(URL url) throws IOException {
                  URLConnection urlConnection = url.openConnection();
                  String authString = username + ":" + password;
                  String authStringEnc = new String(Base64.encodeBase64(authString.getBytes()));
                  urlConnection.setRequestProperty("Authorization", "Basic " + authStringEnc);
                  return urlConnection;
              }
          }
      

      【讨论】:

        猜你喜欢
        • 2011-10-24
        • 2020-06-05
        • 2018-12-25
        • 2016-11-27
        • 2017-10-05
        • 1970-01-01
        • 2014-10-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多