你的位置:首页 > 软件开发 > Java > rest api参数与content

rest api参数与content

发布时间:2016-08-06 21:00:05
最近为项目组提供rest api 时遇到了关于接口参数的传递问题,主要是没有充分考虑到第三方调用者的使用方式,应该尽量的去兼容公司之前提供出去的接口调用方式,这样可以降低第三方调用者的学习成本,尽管之前的方式并不是那么的推荐,好的做法是即兼容老的做法也支持推荐的做法。对于基于ht ...

rest api参数与content

rest api参数与content

最近为项目组提供rest api 时遇到了关于接口参数的传递问题,主要是没有充分考虑到第三方调用者的使用方式,应该尽量的去兼容公司之前提供出去的接口调用方式,这样可以降低第三方调用者的学习成本,尽管之前的方式并不是那么的推荐,好的做法是即兼容老的做法也支持推荐的做法。对于基于http post接口,Content-type我会优先选择application/json,但公司之前提供的接口恰恰采用了application/x-www-form-urlencoded,它是表单默认的提交类型,基于key/value形式提交到服务端的。spring mvc如何接收下面两种经典数据的? (至于form-data,它即可以传键值对也可以上传文件,这里不涉及到文件所以只讨论下面两种):

  • Content-type=application/json:需要在参数上增加@RequestBody这个注解,说明参数是从http的requestbody中获取。

     rest api参数与content

        下图中的参数,是标准的json格式,对前端js非常友好。

        rest api参数与content

  • Content-type=application/x-www-form-urlencoded,参数上不能增加@RequestBody的注解

         下图的可以看出参数形式与get请求时,URL后面的参数格式

        rest api参数与content

rest api参数与content     上图中的做法目前有如下问题

  • 序列化的字段是约定好的,也是基于我们的post model基本上来处理的,是针对性的converter
  • 代码最后面调用的jackon的convertValue,对需要反序列化的对象类型有要求,好像不支持泛型类型,比如这种类型的就不行: CommonParamInfoDto<SearchParamInfo<ProductSearchInfo>>

     完整的conveter代码如下,其实主要代码就是上图贴图中的那么对特定字段的序列化处理,其它的方法都是默认即可。

public class ObjectHttpMessageConverter implements HttpMessageConverter<Object> {  private final FormHttpMessageConverter formHttpMessageConverter = new FormHttpMessageConverter();  private final ObjectMapper objectMapper = new ObjectMapper();  private static final LinkedMultiValueMap<String, ?> LINKED_MULTI_VALUE_MAP = new LinkedMultiValueMap<>();  private static final Class<? extends MultiValueMap<String, ?>> LINKED_MULTI_VALUE_MAP_CLASS      = (Class<? extends MultiValueMap<String, ?>>) LINKED_MULTI_VALUE_MAP.getClass();  @Override  public boolean canRead(Class clazz, MediaType mediaType) {    return objectMapper.canSerialize(clazz) && formHttpMessageConverter.canRead(MultiValueMap.class, mediaType);  }  @Override  public boolean canWrite(Class clazz, MediaType mediaType) {    return false;  }  @Override  public List<MediaType> getSupportedMediaTypes() {    return formHttpMessageConverter.getSupportedMediaTypes();  }  @Override  public Object read(Class clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException {    Map input = formHttpMessageConverter.read(LINKED_MULTI_VALUE_MAP_CLASS, inputMessage).toSingleValueMap();    String jsonParamKey="jsonParam";    if(input.containsKey(jsonParamKey)) {      String jsonParam = input.get(jsonParamKey).toString();      SearchParamInfo<Object> searchParamInfo = new SearchParamInfo<Object>();      Object jsonParamObj = JsonHelper.json2Object(jsonParam, searchParamInfo.getClass());      input.put("jsonParam", jsonParamObj);    }    Object objResult= objectMapper.convertValue(input, clazz);    return objResult;  }  @Override  public void write(Object o, MediaType contentType, HttpOutputMessage outputMessage) throws UnsupportedOperationException {    throw new UnsupportedOperationException("");  }}

原标题:rest api参数与content

关键词:

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

可能感兴趣文章

我的浏览记录