我的代理控制器中有以下方法,我正在尝试代理到下游服务。
@PostMapping(value = "/**",
consumes = [MediaType.APPLICATION_JSON_VALUE, MediaType.MULTIPART_FORM_DATA_VALUE],
produces = MediaType.APPLICATION_JSON_VALUE)
ResponseEntity proxyPostRequest(@RequestHeader HttpHeaders requestHeaders, HttpServletRequest request, ProxyExchange<String> proxy) throws Exception {
requestHeaders.addIfAbsent("x-program-id", request.getAttribute("programId").toString())
// required for host header match
requestHeaders.remove(HttpHeaders.HOST)
requestHeaders.add(HttpHeaders.HOST, host)
proxy.headers(requestHeaders)
final URI uri = new URI(scheme, null, host, Integer.valueOf(port), request.getRequestURI(), request.getQueryString(), null)
ResponseEntity responseEntity = proxy.uri(uri).post()
return enrichResponse(responseEntity)
}
我在下游服务中遇到以下错误:
Could not resolve parameter [0] in public org.springframework.http.ResponseEntity
但是直接在下游服务中使用相同的 API 后,它工作正常。
我在反向代理请求时似乎做错了什么。 以下是我正在尝试的示例 cURL 请求:
curl --location 'http://localhost:8080/test/path/'\
--form 'logoFile=@"path-to-file.txt"' \
--form 'message="hello"'
如果仍有帮助:
对于您的控制器
@RequestMapping("/**")
public ResponseEntity<String> proxyRequest(
HttpMethod method,
HttpServletRequest request,
@RequestBody(required = false) String body,
@RequestHeader Map<String, String> headers,
@RequestParam(required = false) MultiValueMap<String, Object> params,
@RequestParam(required = false) MultipartFile file
) throws URISyntaxException {...}
然后您可以处理服务上的 restemplate 上的参数,例如
ResponseEntity<String> handleMultipart(MultipartFile file, MultiValueMap<String, Object> params, URI url) {
try {
// Convert MultipartFile to Resource
ByteArrayResource contentsAsResource = new ByteArrayResource(file.getBytes()) {
@Override
public String getFilename() {
return file.getOriginalFilename();
}
};
MultiValueMap<String, Object> map = new LinkedMultiValueMap<String, Object>();
map.add("file", contentsAsResource);
map.addAll(params);
return restTemplate.postForEntity(url, map, String.class);
} catch (IOException e) {
throw new RuntimeException(e);
}
}