如何在项目中引入RestTemplate

1.什么是 RestTemplate?

RestTemplate 其实是简化了发起 HTTP 请求以及处理响应的过程,并且支持 REST,我们在项目中使用的比较多的可能就是 HttpUtils,使用

2.项目中集成 RestTemplate

首先配置 RestTemplate 的配置类,这个也可以无需配置,但是可在配置中设置连接的超时时间。

package com.jiafly.pisces.common.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;

/**
 * restTemplate配置类
 *
 * @author liuyi
 * @date 2020/1/1 22:35 PM
 */
@Configuration
public class RestTemplateConfig {

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

    @Bean
    public ClientHttpRequestFactory simpleClientHttpRequestFactory() {
        SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
        factory.setConnectTimeout(60000);
        factory.setReadTimeout(30000);
        return factory;
    }

}

3.如何使用

RestTemplate 在使用时也是很方便的,针对get,post,put,delete,patch 等rest方法都提供了相应的支持,直接使用即可。这里需要注意的是Get请求的时候。

下面我这里是在请求微信登录接口时使用的Get请求,直接注入到要使用的类中。


package com.jiafly.pisces.common;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.jiafly.pisces.common.constant.MsgInfoEnum;
import com.jiafly.pisces.exception.UserDefinedException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;

import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;

/**
 * 微信根据code获取用户信息
 *
 * @author liuyi
 * @date 2020/1/1 22:40 PM
 */
@Component
public class WxUtil {

    @Value("${wx.appId}")
    private String appId;

    @Value("${wx.appSecret}")
    private String appSecret;

    private static final String ERROR_CODE = "errcode";
    private static final String ERROR_MSG = "errmsg";

    private final RestTemplate restTemplate;

    @Autowired
    public WxUtil(RestTemplate restTemplate) {
        this.restTemplate = restTemplate;
    }

    /**
     * 微信登陆授权
     *
     * @param code 微信登陆唯一标识
     * @return 返回的openId和sessionKey
     */
    public Map<String, Object> wxLogin(String code) throws UnsupportedEncodingException {
        //微信端登录code值
        String url = "https://api.weixin.qq.com/sns/jscode2session?appid={appId}&secret={secret}&js_code={js_code}&grant_type={grant_type}";

        Map<String, String> params = new HashMap<>(16);
        params.put("appId", appId);
        params.put("secret", appSecret);
        params.put("js_code", code);
        params.put("grant_type", "authorization_code");
        ResponseEntity<String> forEntity = restTemplate.getForEntity(url, String.class, params);

        Map<String, Object> wxMap = JSON.parseObject(forEntity.getBody(), new TypeReference<Map<String, Object>>() {
        });
        if (Objects.nonNull(wxMap) && wxMap.containsKey(ERROR_CODE)) {
            throw new UserDefinedException(MsgInfoEnum.WX_ERROR, wxMap.get(ERROR_CODE) + ":" + wxMap.get(ERROR_MSG));
        }
        return wxMap;
    }
}

通过观察上述代码,在请求时,参数 params 虽然是map,但是还必须在url中拼接好参数,通过 map 的 key 映射到 url中,否则 get 请求是不会成功的,其余的post请求则可正常使用,只需要传递 url 和参数及类型即可,使用起来十分方便。

你可能感兴趣的:(Java)