如何在springboot中代理多部分请求

问题描述 投票:0回答:1

我的代理控制器中有以下方法,我正在尝试代理到下游服务。

    @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"'
spring spring-boot reverse-proxy
1个回答
0
投票

如果仍有帮助:

对于您的控制器

@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);
    }


}
© www.soinside.com 2019 - 2024. All rights reserved.