如何从 Spring Boot 控制器向另一台服务器执行 http 请求

问题描述 投票:0回答:3

如何从托管于

localhost:8080
的服务器上托管于
localhost:80
的 Spring Boot 应用程序执行 GET HTTP 请求。

例如,如何从我的 Spring 应用程序获取托管在

locahost:80/image.jpg
的图像?

java spring http get get-request
3个回答
10
投票

您可以通过两种方式发出第三方外部 API 请求。

  1. 休息模板

         RestTemplate restTemplate = new RestTemplate();
    
         String uri = localhost:80; // or any other uri
    
         HttpHeaders headers = new HttpHeaders();
         headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
         headers.add("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36");
    
         HttpEntity<String> entity = new HttpEntity<>("parameters", headers);
         ResponseEntity<?> result =
                 restTemplate.exchange(uri, HttpMethod.GET, entity, returnClass);
         return result.getBody();
    

如果您想获取图像,请使用以下方法:

String url = "http://img.championat.com/news/big/l/c/ujejn-runi_1439911080563855663.jpg";
byte[] imageBytes = restTemplate.getForObject(url, byte[].class);
Files.write(Paths.get("image.jpg"), imageBytes);

您还需要在应用程序配置中配置 ByteArrayHttpMessageConverter:

@Bean
public RestTemplate restTemplate(List<HttpMessageConverter<?>> messageConverters) {
    return new RestTemplate(messageConverters);
}

@Bean
public ByteArrayHttpMessageConverter byteArrayHttpMessageConverter() {
    return new ByteArrayHttpMessageConverter();
}
  1. Unirest 在pom中添加unirest依赖:
<!-- Unirest java -->
    <dependency>
      <groupId>com.mashape.unirest</groupId>
      <artifactId>unirest-java</artifactId>
      <version>${unirest.java.version}</version>
    </dependency>

调用api的代码:

HttpResponse<JsonNode> jsonResponse = Unirest.get(your_get_url_in_string)
                    .header("header_string", "header_value")
                    .queryString("query", "query_if_any")
                    .asJson();
JsonNode responseBody = jsonResponse.getBody();

2
投票

如果你想用 spring 发送请求,你可以这样做

//first create e restemplate variable
RestTemplate restTemplate=new RestTemplate();

//you can create and edit header
HttpHeaders header= new HttpHeaders();
header.add("Authorization", "*****************");
header.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
header.add("Accept", "application/json");

//you can create and edit body to
MultiValueMap<String, String> body= new LinkedMultiValueMap<String, String>();
body.add("grant_type", "client_credentials");

HttpEntity<MultiValueMap<String, String>> requeteHttp =new HttpEntity<MultiValueMap<String, String>>(body, header);

//After you can create a request
ResponseEntity<Response_class> reponse = restTemplate.postForEntity("your api link", requeteHttp , Response_class.class);
//if you want to send a get request you can edit postForEntity to get

关于Response_class 如果你知道请求的返回类型,你可以创建一个类并在这里使用它,否则你可以使用字符串来代替

如果你的请求返回这样的json

{
    "token_type":"***",
    "access_token":"***",
    "expires_in":"***",
}

您可以创建一个 Response_class 控制器(类)并像我们上面那样调用它,否则您可以使用字符串代替

public class Response_class{
    private String token_type;
    private String access_token;
    private String expires_in;

    public Response_class(String token_type, String access_token, String expires_in) {
        this.token_type = token_type;
        this.access_token = access_token;
        this.expires_in = expires_in;
    }

    public Response_class() {
    }

    public String getToken_type() {
        return token_type;
    }

    public void setToken_type(String token_type) {
        this.token_type = token_type;
    }

    public String getAccess_token() {
        return access_token;
    }

    public void setAccess_token(String access_token) {
        this.access_token = access_token;
    }

    public String getExpires_in() {
        return expires_in;
    }

    public void setExpires_in(String expires_in) {
        this.expires_in = expires_in;
    }


}

1
投票

您可以使用WebClient:

byte[] image = WebClient.create("locahost:80/image.jpg")
        .get()
        .accept(MediaType.IMAGE_JPEG)
        .retrieve()
        .bodyToMono(byte[].class)
        .block();
© www.soinside.com 2019 - 2024. All rights reserved.