javascript
Springboot学习问题记录
1、spring boot與cloud構建微服務,返回數據從json變成了xml
問題:本身spingboot項目是用@RestController注解,返回結果也是json格式,但是結合springcloud的eureka構建微服務之后,無論是消費者還是提供者,均返回的xml格式,必須在提供者與消費者的方法上添加produces=“application/json”,但是這樣本身@RestController注解里集成的@ResponseBody不就沒用了嗎?
解決:把這個jackson-dataformat-xml依賴去掉。它是提供了jackson將實體類轉化為xml相關的作用。而本身jackson是可以將實體類轉化為json的,所以這樣Jackson是可以將實體類轉化為兩種類型的數據,而具體要轉化為哪一種數據,是要看http請求里面的accept頭信息的,我的瀏覽器chrome的accept是??Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8?,然后服務器會根據accept來決定是返回xml還是json,由于瀏覽器accept只有最后的*/*是匹配?application/json的,而application/xml在*/*前面,優先級比json高,所以用瀏覽器直接調用是會優先返回xml格式的。
?? ???? <dependency>
?? ??? ??? ?<groupId>org.springframework.cloud</groupId>
?? ??? ??? ?<artifactId>spring-cloud-starter-eureka-server</artifactId>
?? ??? ??? ?<exclusions>
?? ??? ??? ??? ?<exclusion>
?? ??? ??? ??? ??? ?<groupId>com.fasterxml.jackson.dataformat</groupId>
?? ??? ??? ??? ??? ?<artifactId>jackson-dataformat-xml</artifactId>
?? ??? ??? ??? ?</exclusion>
?? ??? ??? ?</exclusions>
?? ??? ?</dependency>
?
2、GET請求多參數的URL
假設我們請求的URL包含多個參數,例如http://microservice-provider-user/get?id=1&username=張三 ,要怎么辦呢?
我們知道Spring Cloud為Feign添加了Spring MVC的注解支持,那么我們不妨按照Spring MVC的寫法嘗試一下:
然而我們測試時會發現該寫法不正確,我們將會收到類似以下的異常:
feign.FeignException: status 405 reading UserFeignClient#get0(User); content: {"timestamp":1482676142940,"status":405,"error":"Method Not Allowed","exception":"org.springframework.web.HttpRequestMethodNotSupportedException","message":"Request method 'POST' not supported","path":"/get"}由異常可知,盡管指定了GET方法,Feign依然會發送POST請求。
正確寫法如下:
(1) 方法一
這是最為直觀的方式,URL有幾個參數,Feign接口中的方法就有幾個參數。使用@RequestParam注解指定請求的參數是什么。
(2) 方法二
多參數的URL也可以使用Map去構建。當目標URL參數非常多的時候,可使用這種方式簡化Feign接口的編寫。
?
3、POST請求包含多個參數
下面我們來討論如何使用Feign構造包含多個參數的POST請求。舉個例子,假設我們的用戶微服務的Controller是這樣編寫的:
我們的Feign接口要如何編寫呢?答案非常簡單,示例:
4、自己不能調用自己的FeignClient?
例如:auth-service有控制器,針對控制器單獨寫了FeignClient,作為SDK。另一system-service調用SDK,通過FeignClient訪問auth-service的控制器,因為有攔截器,攔截器中調用了自己的SDK中的FeignClient。會出現報錯:FeignClient未找到實現??赡苡写炞C。
但是這么實現確實有問題,自己調用自己的Feignclient確實沒有必要,FeignClient中其實就是調用自己的實現,為什么不直接調自己的實現呢,還用從client中轉一下?所以自己調用自己的FeignClient情況,還是直接調用自己的方法吧。
轉載于:https://www.cnblogs.com/leanfish/p/9026790.html
總結
以上是生活随笔為你收集整理的Springboot学习问题记录的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: .NET轻量级ORM框架Dapper入门
- 下一篇: 【原创】面向对象作业:选课系统中用pic