国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 網站 > 建站經驗 > 正文

自定義content-type及自動匹配HttpMessageConverter

2019-11-02 13:51:26
字體:
來源:轉載
供稿:網友
  有時候在文件管理模塊中有用到自定義content-type,以及自動匹配HttpMessageConverter,但是在解決這些問題的時候有朋友經常遇到問題。
  這兩天研究了一下這個問題的解決問題  springmvc通過自定義http accept或者content-type自動選擇HttpMessageConverter
  RestTmplate設置headers:
  restTemplate設置headers有三種方式
  1、通過設置MessageConverters
  2、通過設置攔截器(ClientHttpRequestInterceptor)
  3、通過配置HttpHeaders
  一般的restTemplate請求都可以設置HttpHeaders,因此HttpHeaders是比較容易想到的。
  但使用http  get方式的時候restTemplate沒有設置HttpHeaders的地方
  文件管理器模塊有個功能是直接獲取文件的字節數組返回給客戶端,以提高javascript客戶端的解析速度
  返回byte[] 需要有相應解析器:ByteArrayHttpMessageConverter。它對應的Content-Type是application/octet-stream
  而我們用的是自定義的:application/bytes ,
  在服務端配置文件加入下面配置
  Java代碼  
  <bean id="byteConverter" class="org.springframework.http.converter.ByteArrayHttpMessageConverter">
  <property name="supportedMediaTypes">
  <list>
  <value>application/bytes</value>
  </list>
  </property>
  </bean>
  <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter ">
  <property name="messageConverters">
  <list>
  <ref bean="jsonConverter" />
  //信息轉換器放入適配器中
  <ref bean="byteConverter" />
  </list>
  </property>
  </bean>
  然后在方法上設置headers
  @RequestMapping(value = "/public/{appId}/{fileName}", method = RequestMethod.GET, headers = { "content-type=application/bytes" })
  服務端的配置完成
  客戶端restTemplate不能使用HttpHeaders,只能用后兩種
  RestTemplate初始化的時候會加入5個信息轉換器,其中就有ByteArrayHttpMessageConverter,
  這樣到服務端加上自己設置的就有6種類型,在自動匹配HttpMessageConverter會匹配到不是自己想要的轉換器,比如這6個在getBytes這個功能的測試中,會匹配成json的轉換器。
  為避免這樣就在RestTemplate請求前,用自定義Content-Type的ByteArrayHttpMessageConverter覆蓋默認的配置
  通過設置HttpMessageConverters
  Java代碼  
  ByteArrayHttpMessageConverter converter = new ByteArrayHttpMessageConverter();
  converter.setSupportedMediaTypes(Collections.singletonList(MediaType.valueOf("application/bytes")));
  restTemplate.setMessageConverters((List)Collections.singletonList(converter));
  通過設置ClientHttpRequestInterceptor
  Java代碼  
  ClientHttpRequestInterceptor interceptor=   new ClientHttpRequestInterceptor() {
  @Override
  public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution)
  throws IOException {
  HttpRequestWrapper wrapper = new HttpRequestWrapper(request);
  MediaType mt=MediaType.valueOf("application/bytes");
  wrapper.getHeaders().setContentType(mt);
  wrapper.getHeaders().setAccept((List)Collections.singletonList(mt));
  return execution.execute(wrapper, body);
  }
  };
  restTemplate.setInterceptors(Collections.singletonList(interceptor));
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 建湖县| 深圳市| 崇阳县| 灵石县| 虎林市| 青冈县| 大田县| 曲周县| 白城市| 牟定县| 天长市| 孙吴县| 邵阳县| 专栏| 大兴区| 惠州市| 福鼎市| 信阳市| 神农架林区| 恩平市| 仁寿县| 建德市| 弥勒县| 城口县| 尤溪县| 仙桃市| 彭山县| 拉萨市| 遵化市| 黎城县| 莱芜市| 邢台县| 怀宁县| 五寨县| 广平县| 遵义市| 呼伦贝尔市| 阳泉市| 南漳县| 彰化市| 大埔区|