【Day4-Spring Cloud】之RestTemplate--Ribbon负载均衡GET、POST、PUT、DELETE

========================================启动注解 

========================================启动注解
@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @Bean
    @LoadBalanced //启动负载均衡
    public RestTemplate RestTemplate(){
        return new RestTemplate();
    }
}

 ========================================GET调用例子

@Service
public class StudyTestService {
    @Autowired
    private RestTemplate restTemplate;
//***************************************GET请求方法***************************************

//getForEntiry,该方法返回的石ResponseEntity,该对象时Spring对HTTP的请求响应的封装,其中主要存储了HTTP的几个重要元素,
// 比如HTTP请求状态码的枚举对象HttpStatus(也就是我们场所的404,500这些错误码),在它的父类HttpEntiry中还存储着HTTP请求头的信息对象
// HttpHeaders以及泛型类型的请求体对象。比如下面的例子,就是访问USER-SERVER服务的/user请求,
// 同时最后一个参数nameValue会替换url中的{1}占位符,而返回的ResponseEntity对象中的body内容类型会根据第二个参数转换为String类型
public String getForEntityString(){
    String url="http://EUREKA-CLIENT1/queryUser?name={1}";
    ResponseEntity<String> responseEntity = restTemplate.getForEntity(url, String.class, "Jane");
    String body=responseEntity.getBody();
    return body;
}
//如果我们希望返回的body石一个VwDmsUserorgInfo对象类型,也可以这样实现:
public VwDmsUserorgInfo getForEntityClass(){
    String url="http://EUREKA-CLIENT1/queryUser?name={1}";
    ResponseEntity<VwDmsUserorgInfo> responseEntity = restTemplate.getForEntity(url, VwDmsUserorgInfo.class, "Jane");
    VwDmsUserorgInfo body=responseEntity.getBody();
    return body;
}
//上面的例子石比较常用的方法,getForEntity函数实际上提供了以下三种不同的重载实现。
//第一种:
//1.getForEntity(String url,Class responseType,Object... urlVariables);该方法提供了三个参数,其中url为请求的地址,responseType为请求响应体body的包装类型,urlVariables为rul重的参数绑定。
//GET请求的参数绑定通常使用rul中拼接的方式,比如http://EUREKA-CLIENT1/queryUser?name=Jane,我们可以像这样将参数拼接到url中,但更好的方法是在url中使用占位符并配合urlVariables参数实现GET请求的参数绑定,
//比如url定义为http://EUREKA-CLIENT1/queryUser?name={1},然后可以这样来调用:getForEntity("http://EUREKA-CLIENT1/queryUser?name={1}",String.class,"Jane"),其中第三个参数Jane
//会替换url中的{1}占位符,这里需要注意的是,由于urlVariables参数是一个数组,所以它的顺序会对应url中占位符定义的的数字顺序。【如果有多个参数可以在url中用占位符{2},{3},{4}..来代替,然后在urlVariables处依次传参便可】

//2.getForEntity(String url,Class responseType,Map urlVariables);该方法提供的参数中,只有urlVariables的参数类型与上面的方法不同,这里使用了Map类型,所以使用该方法进行参数绑定时需要在占位符中指定Map中参数的key值,比如
//url定义为http://EUREKA-CLIENT1/queryUser?name={name},在Map类型的urlVariables中,我们就需要put一个key为name的参数来绑定url中{name}占位符的值,比如:
public String getForEntityStringByMap(){
    Map<String,String> params=new HashMap<>();
    params.put("name","Jane");
    String url="http://EUREKA-CLIENT1/queryUser?name={1}";
    ResponseEntity<String> responseEntity = restTemplate.getForEntity(url, String.class, params);
    String body=responseEntity.getBody();
    return body;
}
//3.getForEntity(URI uri,Class responseType);该方法使用URI对象来替代之前的url和urlVariables参数来指定访问地址和参数绑定,URI是JDKjava.net包下的一个类
//它标识一个统一资源标识符(Uniform Resource Identifier)引用。比如下面的例子:
public String getForEntityStringByUri(){
    UriComponents uriComponents= UriComponentsBuilder.fromUriString("http://EUREKA-CLIENT1/queryUser?name={name}")
            .build()
            .expand("Jane")
            .encode();
    URI uri=uriComponents.toUri();
    ResponseEntity<String> responseEntity = restTemplate.getForEntity(uri, String.class);
    String body=responseEntity.getBody();
    return body;
}

//第二种:
//1.getForObject函数。该方法可以理解为对getForEntity的进一步封装,它通过HttpMessageConverterExtractor对HTTP的请求响应体body内容进行对象转换,实现请求直接返回包装好的对象内容。比如:
public String getForObjectString(){
    UriComponents uriComponents= UriComponentsBuilder.fromUriString("http://EUREKA-CLIENT1/queryUser?name={name}")
            .build()
            .expand("Jane")
            .encode();
    URI uri=uriComponents.toUri();
    String result = restTemplate.getForObject(uri, String.class);
    return result;
}
//当body是一个VwDmsUserorgInfo对象是,可以直接这样实现:
public VwDmsUserorgInfo getForObjectClass(){
    UriComponents uriComponents= UriComponentsBuilder.fromUriString("http://EUREKA-CLIENT1/queryUser?name={name}")
            .build()
            .expand("Jane")
            .encode();
    URI uri=uriComponents.toUri();
    VwDmsUserorgInfo result = restTemplate.getForObject(uri, VwDmsUserorgInfo.class);
    return result;
}
//当不需要关注请求响应除body外的其它内容时,该函数就非常好用,可以少一个从Response中获取body的步骤。它与getForEntiry函数类似,也提供了三种不同的重载实现。
//1.getForObject(String url,Class responseType,Object... urlVariables);与getForEntity的方法蕾西,url参数指定访问的地址,responseType参数定义该方法的返回类型,urlVariables参数为url中占位符对应的参数。
//2.getForObject(String url,Class responseType,Map urlVariables);在该函数中,使用Map类型的urlVariables替代上面数组形式的urlVariables,因此使用时在url中需要将占位符的名称与Map类型中的key一一对应设置。
//3.getForObject(URI uri,Class responseType);该方法使用URI对象来替代之前的url和urlVariables参数使用。
}

 ========================================POST调用例子

@Service
public class StudyTestService {
    @Autowired
    private RestTemplate restTemplate;
//***************************************POST请求方法***************************************
//在RestTemplate中,对POST请求时可以通过如下三个方法进行调用实现。

//第一种:postForEntity函数,该方法同GET请求中的getForEntity类似,会在调用后返回ResponseEntiry<T>对象,其中T为请求响应的body类型。比如下面这个例子,使用postForEntiry提交POST请求到EUREKA-CLIENT1服务的/queryName接口,
// 提交的body内容为VwDmsUserorgInfo对象,请求响应返回的body类型为String
public String postForEntity(){
    VwDmsUserorgInfo vdui=new VwDmsUserorgInfo();
    vdui.setName("Jane");

    ResponseEntity<String> responseEntity = restTemplate.postForEntity("http://EUREKA-CLIENT1/addUser", vdui, String.class);
    String body = responseEntity.getBody();
    return body;
}
//postForEntiry函数也实现了三张不同的重载方法。
//1.postForEntiry(String url,Object requestObject,Class responseType,Object... uriVariables)
//2.postForEntiry(String url,Object requestObject,Class responseType,Map uriVariables)
//3.postForEntiry(URI uri,Object requestObject,Class responseType)
//这些函数中的参数用法大部分与getForEntiry一致,比如,第一个重载函数和第二个重载函数中的uriVariables参数都用来对url中的参数进行绑定使用;responseType参数是对请求响应的body内容的类型定义。
//这里需要注意的是新加的requestObject参数,该参数可以是一个普通对象,也可以是一个HttpEntity对象,如果是一个普通对象,而非HttpEntity对象的时候
//RestTemplate会将请求对象转换为一个HttpEntiry对象来处理,其中Object就是request的类型,request内容会被视作完成的body来处理,而如果request是一个HttpEntiry对象,
// 那么就会被当做一个完整的HTTP请求对象来处理,这个request中不仅包含body的内容也包含了header的内容。

//第二种:postForObject函数,该方法也跟getForObject的类型类似,它的作用时间简化postForEntiry的后续处理。通过直接将请求响应的body内容包装成对象来返回使用,比如下面的例子:
public String postForObject(){
    VwDmsUserorgInfo vdui=new VwDmsUserorgInfo();
    vdui.setName("Jane");
    String s = restTemplate.postForObject("http://EUREKA-CLIENT1/updateUser", vdui, String.class);
    return s;
}
//postForObject函数也实现了三种不同的重载方法;
//postForObject(String url,Object request,CLass responseType,Object... uriVariables)
//postForObject(String url,Object request,Class responseType,Map uriVariables)
//postForObject(URI url,Object request,Class responseType)
//这三个函数除了返回的对象类型不同,函数的传入参数均与postForEntity一致,因此可参考之前postForEntity的说明。

//第三种:postForLocation函数。该方法实现了以POST请求提交资源,并返回新资源的URI,比如下面的例子:
public URI postForLocation(){
    VwDmsUserorgInfo vdui=new VwDmsUserorgInfo();
    vdui.setName("Jane");
    URI uri = restTemplate.postForLocation("http://EUREKA-CLIENT1/updateUser", vdui, String.class);
    return uri;
}
//postForLocation函数也实现了三种不同的重载方法:
//postForLocation(String url,Object request,Object... urlVariables)
//postForLocation(String url,Object request,Map urlVariables)
//postForLocation(URI uri,Object request)
//由于postForLocation函数会返回新资源的URI,该URI就相当于指定了返回类型,所以此方法实现的POST请求不需要像postForEntity和postForObject那样指定responseType。其他的参数用法相同。
}

 ========================================PUT调用例子


//***************************************PUT请求方法***************************************
@Service
public class StudyTestService {
    @Autowired
    private RestTemplate restTemplate;
//在RestTemplate中,对PUT请求可以通过put方法进行调用实现,比如:
public void put1(){
    VwDmsUserorgInfo vdui=new VwDmsUserorgInfo();
    Long id=10001L;
    restTemplate.put("http://EUREKA-CLIENT1/user/{1}",vdui,id);
}
//put函数也实现了三种不同的重载方法:
//put(String url,Object request,Object... urlVariables)
//put(String url,Object request,Map urlVariables)
//put(URI url,Object request)
//put函数为void类型,所以没有返回内容,也就没有其他函数定义的responseType参数,除此之外的其他传入参数定义与用法与postForObject基本一致。
}

 ========================================DELETE调用例子


//***************************************DELETE请求方法***************************************
@Service
public class StudyTestService {
    @Autowired
    private RestTemplate restTemplate;
    public void delete(){
        Long id=10000000000L;
        restTemplate.delete("http://EUREKA-CLIENT1/deleteUser/{1}",id);
    }
//delete函数也实现了三种不同的重载方法
//delete(String url,Object... urlVariables)
//delete(String url,Map urlVariables)
//delete(RUI url)
//由于我们在进行REST请求时,通常都将DELETE请求的唯一标识拼接在url中,所以DELETE请求也不需要request的body信息,就如上面的三个函数实现一样
//非常简单,url指定DELETE请求的位置,urlVariables绑定url中的参数即可。
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值