springboot-24-restTemplate的使用

项目中使用的是HttpClient, 后来改成springboot, 偶然间发现restTemplate

原博客: http://blog.csdn.net/u013895412/article/details/53096855

{  
  "Author": "tomcat and jerry",  
  "url":"http://www.cnblogs.com/tomcatandjerry/p/5899722.html"      
} 

核心代码: 

String url = "http://localhost:8080/json";  
JSONObject json = restTemplate.getForEntity(url, JSONObject.class).getBody();  

 

实用: 

restConfig.java

package com.iwhere.scrapy.rest;

import java.nio.charset.Charset;
import java.util.Iterator;
import java.util.List;

import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
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.http.converter.HttpMessageConverter;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.web.client.RestOperations;
import org.springframework.web.client.RestTemplate;

/**
 * 定义restTemplate的配置
 * 
 * @author wenbronk
 * @Date 下午4:33:35
 */
@Configuration
public class RestTemplateConfig {

    @Bean
    @ConditionalOnMissingBean({ RestOperations.class, RestTemplate.class })
    public RestTemplate restTemplate(ClientHttpRequestFactory factory) {
        // return new RestTemplate(factory);

        RestTemplate restTemplate = new RestTemplate(factory);

        // 使用 utf-8 编码集的 conver 替换默认的 conver(默认的 string conver 的编码集为"ISO-8859-1")
        List<HttpMessageConverter<?>> messageConverters = restTemplate.getMessageConverters();
        Iterator<HttpMessageConverter<?>> iterator = messageConverters.iterator();
        while (iterator.hasNext()) {
            HttpMessageConverter<?> converter = iterator.next();
            if (converter instanceof StringHttpMessageConverter) {
                iterator.remove();
            }
        }
        messageConverters.add(new StringHttpMessageConverter(Charset.forName("UTF-8")));

        return restTemplate;
    }

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

 

 

请求测试: 

SpringRestTemplateApp.java  
@RestController  
@EnableAutoConfiguration  
@Import(value = {Conf.class})  
public class SpringRestTemplateApp {  
      
    @Autowired  
    RestTemplate restTemplate;  
      
    /***********HTTP GET method*************/  
    @RequestMapping("")  
    public String hello(){  
        String url = "http://localhost:8080/json";  
        JSONObject json = restTemplate.getForEntity(url, JSONObject.class).getBody();  
        return json.toJSONString();  
    }  
      
    @RequestMapping("/json")  
    public Object genJson(){  
        JSONObject json = new JSONObject();  
        json.put("descp", "this is spring rest template sample");  
        return json;  
    }  
      
    /**********HTTP POST method**************/  
    @RequestMapping("/postApi")  
    public Object iAmPostApi(@RequestBody JSONObject parm){  
        System.out.println(parm.toJSONString());  
        parm.put("result", "hello post");  
        return parm;  
    }  
      
    @RequestMapping("/post")  
    public Object testPost(){  
        String url = "http://localhost:8080/postApi";  
        JSONObject postData = new JSONObject();  
        postData.put("descp", "request for post");  
        JSONObject json = restTemplate.postForEntity(url, postData, JSONObject.class).getBody();  
        return json.toJSONString();  
    }  
      
    public static void main(String[] args) throws Exception {  
        SpringApplication.run(SpringRestTemplateApp.class, args);  
    }  
      
}  

也可以异步调用

@RequestMapping("/async")  
    public String asyncReq(){  
        String url = "http://localhost:8080/jsonAsync";  
        ListenableFuture<ResponseEntity<JSONObject>> future = asyncRestTemplate.getForEntity(url, JSONObject.class);  
        future.addCallback(new SuccessCallback<ResponseEntity<JSONObject>>() {  
            public void onSuccess(ResponseEntity<JSONObject> result) {  
                System.out.println(result.getBody().toJSONString());  
            }  
        }, new FailureCallback() {  
            public void onFailure(Throwable ex) {  
                System.out.println("onFailure:"+ex);  
            }  
        });  
        return "this is async sample";  

自定义header

@RequestMapping("/headerApi")//模拟远程的restful API  
    public JSONObject withHeader(@RequestBody JSONObject parm, HttpServletRequest req){  
        System.out.println("headerApi====="+parm.toJSONString());  
        Enumeration<String> headers = req.getHeaderNames();  
        JSONObject result = new JSONObject();  
        while(headers.hasMoreElements()){  
            String name = headers.nextElement();  
            System.out.println("["+name+"]="+req.getHeader(name));  
            result.put(name, req.getHeader(name));  
        }  
        result.put("descp", "this is from header");  
        return result;  
    }  
  
    @RequestMapping("/header")  
    public Object postWithHeader(){  
    //该方法通过restTemplate请求远程restfulAPI  
        HttpHeaders headers = new HttpHeaders();  
        headers.set("auth_token", "asdfgh");  
        headers.set("Other-Header", "othervalue");  
        headers.setContentType(MediaType.APPLICATION_JSON);  
          
        JSONObject parm = new JSONObject();  
        parm.put("parm", "1234");  
        HttpEntity<JSONObject> entity = new HttpEntity<JSONObject>(parm, headers);  
        HttpEntity<String> response = restTemplate.exchange(  
                "http://localhost:8080/headerApi", HttpMethod.POST, entity, String.class);//这里放JSONObject, String 都可以。因为JSONObject返回的时候其实也就是string  
        return response.getBody();  
    }  

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值