使用 RestTemplate 发起请求时报错如下
解决方案:自定义一个转换器
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.springframework.http.HttpInputMessage;
import org.springframework.http.HttpOutputMessage;
import org.springframework.http.converter.AbstractHttpMessageConverter;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.http.converter.HttpMessageNotWritableException;
import org.springframework.util.StreamUtils;
import java.io.IOException;
import java.nio.charset.Charset;
/**
* JSON body请求转换器
* 继承 AbstractHttpMessageConverter 并实现他的转换方法
* @Description JSON body请求
* @Author Mr.dan
*/
public class JSONObjectHttpMessageConverter extends AbstractHttpMessageConverter<JSONObject> {
@Override
protected boolean supports(Class<?> clazz) {
return clazz == JSONObject.class;
}
/**
* 输入
* @param clazz
* @param inputMessage
* @return
* @throws IOException
* @throws HttpMessageNotReadableException
*/
@Override
protected JSONObject readInternal(Class<? extends JSONObject> clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException {
String jsonStr = StreamUtils.copyToString(inputMessage.getBody(), Charset.forName("UTF-8"));
return JSON.parseObject(jsonStr);
}
/**
* 输出
* @param j
* @param outputMessage
* @throws IOException
* @throws HttpMessageNotWritableException
*/
@Override
protected void writeInternal(JSONObject j, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException {
StreamUtils.copy(j.toJSONString(), Charset.forName("UTF-8"), outputMessage.getBody());
}
}
构建bean时设置转换器参数
@Bean
public RestTemplate httpTemplate() {
RestTemplate restTemplate = new RestTemplate();
HttpComponentsClientHttpRequestFactory httpRequestFactory = new HttpComponentsClientHttpRequestFactory();
//设置30秒超时
httpRequestFactory.setConnectionRequestTimeout(30000);
httpRequestFactory.setConnectTimeout(30000);
httpRequestFactory.setReadTimeout(30000);
//设置转换器列表
restTemplate.setMessageConverters(getConverts());
return restTemplate;
}
private List<HttpMessageConverter<?>> getConverts() {
List<HttpMessageConverter<?>> messageConverters = new ArrayList<>();
// String转换器
StringHttpMessageConverter stringConvert = new StringHttpMessageConverter();
//JSON转换器
JSONObjectHttpMessageConverter jsonObjectConverter = new JSONObjectHttpMessageConverter();
List<MediaType> stringMediaTypes = new ArrayList<MediaType>() {{
//添加响应数据格式,不匹配会报401
add(MediaType.TEXT_PLAIN);
add(MediaType.TEXT_HTML);
add(MediaType.APPLICATION_JSON);
}};
stringConvert.setSupportedMediaTypes(stringMediaTypes);
//这里把刚刚的转换器加进去
messageConverters.add(jsonObjectConverter);
messageConverters.add(stringConvert);
// .... 当然还可以有其他类型转换器 都是同样的操作
return messageConverters;
}