采用spring中的restTemplate实现httpClient远程调用服务

        今天我来说说restTemplate吧,它是spring提供的一种远程调用服务的方式,底层封装了httpClient。我之前讲过的webservice是另一种远程调用服务的方式,它是基于http+xml的,平台无关性强。而httpclient是基于http的,一般用于浏览器发送,平台无关性弱。

讲restTemplate之前,先介绍它的api:

执行Get类型的Url,返回响应ResponseEntity或自己定义返回类型

 ResponseEntity getForEntity(java.lang.String url, java.lang.Class responseType, java.util.Map uriVariables)
 ResponseEntity getForEntity(java.lang.String url, java.lang.Class responseType, java.lang.Object... uriVariables)
 ResponseEntity getForEntity(java.net.URI url, java.lang.Class responseType)
 T getForObject(java.lang.String url, java.lang.Class responseType, java.util.Map uriVariables)
 T getForObject(java.lang.String url, java.lang.Class responseType, java.lang.Object... uriVariables)
 T getForObject(java.net.URI url, java.lang.Class responseType)

执行Post类型的Url,返回响应ResponseEntity或自己定义返回类型

 ResponseEntity postForEntity(java.lang.String url, java.lang.Object request, java.lang.Class responseType, java.util.Map uriVariables)
 ResponseEntity postForEntity(java.lang.String url, java.lang.Object request, java.lang.Class responseType, java.lang.Object... uriVariables)
 ResponseEntity postForEntity(java.net.URI url, java.lang.Object request, java.lang.Class responseType)
 T postForObject(java.lang.String url, java.lang.Object request, java.lang.Class responseType, java.util.Map uriVariables)
 T postForObject(java.lang.String url, java.lang.Object request, java.lang.Class responseType, java.lang.Object... uriVariables)
 T postForObject(java.net.URI url, java.lang.Object request, java.lang.Class responseType)

执行del类型的Url

void delete(java.lang.String url, java.util.Map uriVariables)
void delete(java.lang.String url, java.lang.Object... uriVariables)
void delete(java.net.URI url)

执行Put类型的Url

void put(java.lang.String url, java.lang.Object request, java.util.Map uriVariables)
void put(java.lang.String url, java.lang.Object request, java.lang.Object... uriVariables)
void put(java.net.URI url, java.lang.Object request)

 

执行给定Url,并指定的请求RequestEntity,最后返回响应ResponseEntity

 ResponseEntity exchange(RequestEntity requestEntity, java.lang.Class responseType)

 

 ResponseEntity exchange(RequestEntity requestEntity, ParameterizedTypeReference responseType)
 ResponseEntity exchange(java.lang.String url, HttpMethod method, HttpEntity requestEntity, java.lang.Class responseType, java.util.Map uriVariables)
 ResponseEntity exchange(java.lang.String url, HttpMethod method, HttpEntity requestEntity, java.lang.Class responseType, java.lang.Object... uriVariables)
 ResponseEntity exchange(java.lang.String url, HttpMethod method, HttpEntity requestEntity, ParameterizedTypeReference responseType, java.util.Map uriVariables)
 ResponseEntity exchange(java.lang.String url, HttpMethod method, HttpEntity requestEntity, ParameterizedTypeReference responseType, java.lang.Object... uriVariables)
 ResponseEntity exchange(java.net.URI url, HttpMethod method, HttpEntity requestEntity, java.lang.Class responseType)
 ResponseEntity exchange(java.net.URI url, HttpMethod method, HttpEntity requestEntity, ParameterizedTypeReference responseType)

 

主要选择get和post方式进行介绍

定义一个服务端:

 

package com.example.demo.controller;

import com.example.demo.entity.User;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

/**
 * Created by linjiaming
 */
@RestController
public class TestController {

    @GetMapping("/getUser")
    public User getUser() {
        User u = new User();
        u.setName("getUser");
        return u;
    }
    
    @PostMapping("/postUser")
    public User postUser () {
        User u = new User();
        u.setName("postUser");
        return u;
    }

    @PostMapping("/postUserByName")
    public User postUser (@RequestBody User u) {
        return u;
    }
}

分别是get,post无参,post有参方式

定义一个客户端:

package com.example.demo.controller;

import com.example.demo.entity.User;
import java.util.HashMap;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

/**
 * Created by linjiaming
 */
@RestController
public class TestController {
    @Autowired
    RestTemplate restTemplate;

    private static String GET_URL = "http://localhost:8080/getUser";
    private static String POST_URL = "http://localhost:8080/postUser";
    private static String POST_PARAM_URL = "http://localhost:8080/postUserByName";


    /**
     * 测试无参情况
     * @return
     */
    @GetMapping("/testgetUser")
    public User getUser() {
        //getForObject方式
        User user = restTemplate.getForObject(GET_URL, User.class);

        //getForEntity方式
        /*ResponseEntity entity = restTemplate.getForEntity(GET_URL, User.class);
        User user = entity.getBody();*/
        return user;
    }


    @GetMapping("/testpostUser")
    public User postUser () {
        //PostForObject方式
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
        String data = "";
        HttpEntity Entity = new HttpEntity(data, headers);
        User user = restTemplate.postForObject(POST_URL, Entity, User.class);

        //PostForEntity方式
       /* HttpHeaders headers = new HttpHeaders();
        String data = "";
        HttpEntity Entity = new HttpEntity(data, headers);
        ResponseEntity entity = restTemplate.postForEntity(POST_URL, Entity, User.class);
        User user = entity.getBody();*/
        return user;
    }

    @GetMapping("/testpostUserByName")
    public User postUserByName () {
        //PostForObject方式
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
        User u = new User();
        u.setName("lisi");
        u.setAge("18");
        HttpEntity Entity = new HttpEntity(u,headers);
        User user = restTemplate.postForObject(POST_PARAM_URL, Entity, User.class);

        return user;
    }
}

在定义这个controller之前,还需要配置restTemplate:

package com.example.demo.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.ClientHttpRequestFactory;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;

/**
 * Created by linjiaming
 */
@Configuration
public class restTemplateConfig {

    @Bean
    public RestTemplate restTemplate(ClientHttpRequestFactory factory) {
        return new RestTemplate(factory);
    }

    @Bean
    public ClientHttpRequestFactory simpleClientHttpRequestFactory() {
        SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
        factory.setReadTimeout(5000);//ms
        factory.setConnectTimeout(15000);//ms
        return factory;
    }
}

接下来可以测试一下效果了:

分别启动服务端(port:8080)和客户端(port:8081)

地址栏输入:http://localhost:8081/testgetUser

结果:{"name":"getUser","age":null}

地址栏输入:http://localhost:8081/testpostUser

结果:{"name":"postUser","age":null}

地址栏输入:http://localhost:8081/testpostUserByName

结果:{"name":"lisi","age":"18"}

你可能感兴趣的:(http)