【发布时间】:2018-02-21 12:31:48
【问题描述】:
我有这个 Spring REST 控制器方法:
@ApiOperation("My method")
@RequestMapping(method = RequestMethod.POST, value = "/myMethod")
public void myMethod(@RequestParam("myParam") String myParam) {
...
}
REST 客户端是使用带有语言 Java 和库 resttemplate 的 swagger codegen CLI 生成的:
public void myMethod(String myParam) throws RestClientException {
...
return apiClient.invokeAPI(path, HttpMethod.POST, queryParams, postBody, headerParams, formParams, accept, contentType, authNames, returnType);
}
而ApiClient#invokeAPI 的源代码——也是生成的——是:
public <T> T invokeAPI(String path, HttpMethod method, MultiValueMap<String, String> queryParams, Object body, HttpHeaders headerParams, MultiValueMap<String, Object> formParams, List<MediaType> accept, MediaType contentType, String[] authNames, ParameterizedTypeReference<T> returnType) throws RestClientException {
updateParamsForAuth(authNames, queryParams, headerParams);
final UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(basePath).path(path);
if (queryParams != null) {
builder.queryParams(queryParams);
}
final BodyBuilder requestBuilder = RequestEntity.method(method, builder.build().toUri());
if(accept != null) {
requestBuilder.accept(accept.toArray(new MediaType[accept.size()]));
}
if(contentType != null) {
requestBuilder.contentType(contentType);
}
addHeadersToRequest(headerParams, requestBuilder);
addHeadersToRequest(defaultHeaders, requestBuilder);
RequestEntity<Object> requestEntity = requestBuilder.body(selectBody(body, formParams, contentType));
ResponseEntity<T> responseEntity = restTemplate.exchange(requestEntity, returnType);
...
}
现在,当我调用myMethod 传递一个包含+ 的字符串并登录myParam 时,在服务器上我收到一个空格字符而不是+。似乎是一个编码问题,因为加号保留在 URL 查询参数中以替换空格字符。这是来自 swagger codegen 或 Spring 类的错误,还是根本没有错误?我该如何解决?
编辑:
Swagger 定义类似于(从 Spring REST 控制器生成):
{
"swagger": "2.0",
...
"paths": {
"/myMethod": {
"get": {
"operationId": "myMethod",
"produces": [
"application/json"
],
"parameters": [
{
"name": "myParam",
"in": "query",
"required": true,
"type": "string"
}
],
"responses": {
...
}
}
}
...
}
编辑:
类似的问题似乎是路径变量的编码。当我将"bla:bla/bla" 传递给路径变量时,特殊字符: 和/ 不会被编码,而是按原样发送,这会导致服务器端出错,因为找不到映射。
【问题讨论】:
-
能不能也分享一下你用过的合约?
-
@TarunLalwani “合同”是什么意思?
-
我的意思是 Swagger 合约 yaml 或 json
-
@TarunLalwani 我添加了它。
-
您是如何发起呼叫以测试服务的?你是用 curl 还是别的?
标签: java spring-mvc resttemplate spring-web swagger-codegen