RestOperations使用建议
RestOperations
some advices about ESG provider and consumer
public <T> T postForObject(String url, Object request, Class resultClass);
MultiValueMap
MultiValueMap param = new LinkedMultiValueMap();
param.add("k1", "v1");
param.add("k2", "v2");
param.add("k2", "v2v2");
param.add("k3", "v3");
// FormHttpMessageConverter
setContentType("application/www-form-data-urlencode")
// k1=v1&k2=v2&k2=v2v2&k3=v3
// controller
request.getParameter(String name);
request.getParameterMap();
Map/Object(canSerializable)
RestTemplate
will converte request object to JSON
setContentType("application/json")
With Spring MVC @RequestBody
annotation in controller method(handler), Spring MVC GsonHttpMessageConverter
or GsonHttpMessageConverter
etc.
// for controller method parameter annotated with RequestBody
Object body = readFromBodyInputStream(request);
Service provider-Pafa3
No HttpMessageConverter for Pafa3, so we can only use HttpServletRequest#getParameter
to get parameter or read request body by HttpServletRequest#getInputStream
.
But some one did some stupid things, es: SalesEsgFilter, they read the input stream, to do some customized operations such as checking the sign(is it necessary?), and controller can not get input stream anymore.
If still want to check sign in Filter, take this solution:
public class JsonBodyHttpServletRequestWrapper extends HttpServletRequestWrapper {
private Map<String, Object> jsonParam;
public JsonBodyHttpServletRequestWrapper(HttpServletRequest request) {
super(request);
}
public JsonBodyHttpServletRequestWrapper(HttpServletRequest request, Map<String, Object> jsonParam) {
super(request);
this.jsonParam = jsonParam;
}
@Override
public ServletInputStream getInputStream() throws IOException {
// TODO: 2018/4/5 与 getReader 只能调用一次
return null;
}
@Override
public BufferedReader getReader() throws IOException {
// TODO: 2018/4/5
return null;
}
}
or move JSON parameters to HttpServletRequest#getParameter
, over ride getParameter
, getParameterMap
, etc method.
consumer
depend on the way provider get parameter.
HttpServletRequest#getParameter
: MultiValueMap
@RequestBody
: Map
or other can serializable object