Closed yhs0092 closed 4 months ago
对于header的collectionFormat(OpenAPI2.x)= multi 或者style(OpenAPI3.x)= form目前还没支持到。 需要作为一个feature分析下.
顺便问一下, 这样的接口设计, 从业务的角度来讲,默认是期望什么格式?比如:
Token: a, b, c
或者
Token: a
Token: b
HTTP 协议本来就允许同名header的, 我理解我们要讨论的是要支持同名的多个header, 所以第二种更符合预期. 样例如下:
$ curl -H 'x-test: aaa' -H 'x-test: bbb' -H 'x-test: ccc' -v http://localhost:20190/sample/v3/3headers
* Trying 127.0.0.1:20190...
* Connected to localhost (127.0.0.1) port 20190 (#0)
> GET /sample/v3/3headers HTTP/1.1
> Host: localhost:20190
> User-Agent: curl/7.88.1
> Accept: */*
> x-test: aaa
> x-test: bbb
> x-test: ccc
>
< HTTP/1.1 200 OK
< Content-Type: application/json; charset=utf-8
< content-length: 30
<
{"x-test":["aaa","bbb","ccc"]}* Connection #0 to host localhost left intact
顺带说一下, 其实Java-Chassis服务端已经是支持这种同名的多个header了, 而且传递给controller的参数也确实是 List
. 只是客户端逻辑不支持而已.
至于第一种情况, 应该是框架使用者自己在客户端和服务端约定好的参数格式, 需要他们自行处理, 从Java-Chassis的层面上看, 第一种情况本质上还是一个header名对应一个header值的情况, 不是我们这次讨论的问题场景.
问题复现场景
在provider端开发如下接口
如果使用
curl
命令是可以调通的. 但是如果经过EdgeService转发则会遇到报错. 在普通的consumer端微服务里使用RPC或RestTemplate形式调用, 也会遇到同样的异常. 其中RPC调用时使用的是List<String>
来传递同名的多header参数:我们初步分析了一下原因, 是
org.apache.servicecomb.common.rest.codec.param.HeaderProcessorCreator.HeaderProcessor
在将参数对象转换设置到RestClientRequest
中时, 会固定将对象转换为String
, 遇到List类型便会报错.异常栈: