1.请求第三方接口,用feign请求
请求第三方接口,用feign请求,header不通,feign的写法不同
调用时报错Could not write request: no suitable HttpMessageConverter found for request type [com.ccreate.cnpc.mall.dto.zm.ZMPageQueryDTO] and content type [multipart/form-data;charset=UTF-8]
1. 对方接口是multipart/form-data接收格式
package com.mall.controller.feign;
import com.mall.controller.feign.fallback.ZMGoodFeignFallback;
import com.mall.dto.zm.ZMPageQueryDTO;
import com.mall.dto.zm.ZMSpuInfoDTO;
import com.ccreate.common.response.R;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
/**
* 商品
*/
@FeignClient(url = "${zm.host}", name = "cnpc-ZMGood", fallbackFactory = ZMGoodFeignFallback.class)
public interface ZMGoodFeign {
/**
* 商品列表查询
*
*/
@PostMapping(value = "/api/agent/goodsList", produces = {MediaType.APPLICATION_JSON_UTF8_VALUE}, consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
R<ZMSpuInfoDTO> getSpuList(@RequestBody ZMPageQueryDTO page);
}
对方返回的格式
{
code:200,
message:"ok",
data:{
list:[
{
id:"10001661",
name:"migo保温壶家用保温水壶大容量热水瓶304不锈钢热水壶保温瓶暖",
sellingPoint:"304不锈钢 坚韧把手 24小时长效保温",
skuType:"2",
brandId:"100094",
brandName:"miGo",
categoryId:"100278",
categoryIds:"100235,100273,100278",
coverImage:"http://zmzx-b2b.oss-cn-hangzhou.aliyuncs.com/goods/2020052717090891958.jpg",
marketPrice:"189.00",
photos:[
"http://zmzx-b2b.oss-cn-hangzhou.aliyuncs.com/goods/2020052717090891958.jpg",
"http://zmzx-b2b.oss-cn-hangzhou.aliyuncs.com/goods/2020052717091363771.jpg",
],
detailImages:[
"http://zmzx-b2b.oss-cn-hangzhou.aliyuncs.com/goods/2020052717110984525.jpg",
"http://zmzx-b2b.oss-cn-hangzhou.aliyuncs.com/goods/2020052717111337957.jpg",
],
detailContent:"",
deliverTime:"TIME24",
servicePromise:[
"FREE_DELIVERY",
"PROMISE10"
],
afterSaleRule:"",
auditStatus : "1",
agentRejectReason : "",
skuList:[
{
"skuId":"80005071",
"code":"S20003VH.02",
"marketPrice":"199.00",
"agentPrice":"200.00"
"weight":"0.90",
"specList":[
{
"name":"容量",
"value":"2L",
"image":"http://zmzx-b2b.oss-cn-hangzhou.aliyuncs.com/goods/2020052717160413832.jpg"
},
{
"name":"颜色",
"value":"馥芮白",
"image":""
}
],
},
{
"skuId":"80005072",
"code":"S20003VH.01",
"marketPrice":"199.00",
"agentPrice":"200.00"
"weight":"0.90",
"specList":[
{
"name":"容量",
"value":"2L",
"image":"http://zmzx-b2b.oss-cn-hangzhou.aliyuncs.com/goods/2020052717161011241.jpg"
},
{
"name":"颜色",
"value":"新草绿",
"image":""
}
],
},
{
"skuId":"80005073",
"code":"S1506VH.02",
"marketPrice":"189.00",
"weight":"0.80",
"agentPrice":"200.00"
"specList":[
{
"name":"容量",
"value":"1.5L",
"image":"http://zmzx-b2b.oss-cn-hangzhou.aliyuncs.com/goods/2020052717162165903.jpg"
},
{
"name":"颜色",
"value":"馥芮白",
"image":""
}
],
},
{
"skuId":"80005074",
"code":"S1506VH.01",
"weight":"0.80",
"marketPrice":"189.00",
"agentPrice":"200.00"
"specList":[
{
"name":"容量",
"value":"1.5L",
"image":"http://zmzx-b2b.oss-cn-hangzhou.aliyuncs.com/goods/2020052717162532347.jpg"
},
{
"name":"颜色",
"value":"新草绿",
"image":""
}
],
}
],
status:"1",
agentStatus:"1",
agentRejectReason:""
},
],
"total":1
}
}
我们接收R对象
public class R<T> implements Serializable {
private static final int SUCCESS = 200;
private static final String SUCCESS_MESSAGE = "success";
private static final long serialVersionUID = 1L;
private int code = 200;
private String message = "success";
private T data;
}
2. 对方接收格式是x-www-form-urlencoded
我们对应的feign请求是
package com.mall.controller.feign;
import com.mall.controller.feign.fallback.ThirdPriceFeignFallback;
import com.mall.dto.GoodSkuThirdPriceAddDTO;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.util.MultiValueMap;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
/**
* 三方商品价格
*/
@FeignClient(url = "${li.host}", name = "cnpc-price", fallbackFactory = ThirdPriceFeignFallback.class)
public interface ThirdPriceFeign {
// @PostMapping(value = "/price", produces = {MediaType.APPLICATION_JSON_UTF8_VALUE}, consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
@PostMapping(value = "/price",headers = {"content-type=application/x-www-form-urlencoded"})
GoodSkuThirdPriceAddDTO getThirdPrice(@RequestBody MultiValueMap<String, Object> request);
}
这里参数必须是MultiValueMap,否则转换参数的时候就会报错
3. 断点调试
所有的参数封装都会走到org.springframework.cloud.openfeign.support.SpringEncoder#encode这个方法
如上图所示,最终会由
public class AllEncompassingFormHttpMessageConverter extends FormHttpMessageConverter 这个类解析参数
最终组装好header和body参数,再去请求
4. 以后还有请求对方接口header带token或其他header信息的,再总结。