Java 如何在SpringWebFlux控制器中接收GET请求的多部分或有效负载数据
我们目前正在使用WebFlux将一些遗留服务重写为spring框架。因为遗留逻辑允许在GET请求时接收有效负载或多部分数据,所以我们需要在新服务中重新创建该行为 WebFlux不允许我们在Get请求的情况下接收有效负载或多部分数据。我在@RestController和@Controller中测试了这种行为。是否可以更改web flux的配置以处理此类情况 UploadFileController示例:Java 如何在SpringWebFlux控制器中接收GET请求的多部分或有效负载数据,java,spring,spring-webflux,Java,Spring,Spring Webflux,我们目前正在使用WebFlux将一些遗留服务重写为spring框架。因为遗留逻辑允许在GET请求时接收有效负载或多部分数据,所以我们需要在新服务中重新创建该行为 WebFlux不允许我们在Get请求的情况下接收有效负载或多部分数据。我在@RestController和@Controller中测试了这种行为。是否可以更改web flux的配置以处理此类情况 UploadFileController示例: @Controller public class UploadController {
@Controller
public class UploadController {
@GetMapping(value = "/upload")
public @ResponseBody Mono<ResponseEntity<String>> upload(@RequestBody Flux<Part> parts) {
System.out.println("Upload controller was invoked");
return parts.next()
.flatMap(part -> DataBufferUtils.join(part.content()))
.map(this::mapDataBufferToByteArray)
.map(data -> {
String uploadedData = new String(data);
System.out.println("Uploaded file data: " + uploadedData);
return ResponseEntity.ok(uploadedData);
});
}
private byte[] mapDataBufferToByteArray(DataBuffer buffer) {
byte[] data = new byte[buffer.readableByteCount()];
buffer.read(data);
return data;
}
}
public class UploadControllerTest {
@Autowired
private TestRestTemplate testRestTemplate;
@Test
public void shouldUpload() {
// given
final HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.setContentType(MediaType.MULTIPART_FORM_DATA);
LinkedMultiValueMap<String, Object> parameters = new
LinkedMultiValueMap<>();
parameters.add("file", "Test");
// when
ResponseEntity<String> response =
testRestTemplate.exchange("/upload",
HttpMethod.GET,
new HttpEntity<>(parameters, httpHeaders),
String.class);
assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK);
}
}
@控制器
公共类上载控制器{
@GetMapping(value=“/upload”)
public@ResponseBody Mono-upload(@RequestBody-Flux-parts){
System.out.println(“已调用上载控制器”);
返回零件。下一步()
.flatMap(part->DataBufferUtils.join(part.content()))
.map(此::mapDataBufferToByteArray)
.map(数据->{
字符串上传数据=新字符串(数据);
System.out.println(“上传的文件数据:+上传的数据”);
返回ResponseEntity.ok(上传数据);
});
}
专用字节[]mapDataBufferToByteArray(数据缓冲区){
字节[]数据=新字节[buffer.readableByteCount()];
读取(数据);
返回数据;
}
}
公共类UploadControllerTest{
@自动连线
私有TestRestTemplate TestRestTemplate;
@试验
public void shouldUpload(){
//给定
最终HttpHeaders HttpHeaders=新HttpHeaders();
httpHeaders.setContentType(MediaType.MULTIPART\u FORM\u数据);
LinkedMultiValueMap参数=新建
LinkedMultiValueMap();
添加(“文件”、“测试”);
//什么时候
响应性响应=
testrestemplate.exchange(“/upload”,
HttpMethod.GET,
新的HttpEntity(参数、HttpHeader),
字符串(类);
assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK);
}
}
如何创建webfilter,将传入的get请求转换为内部发布
@RestController
public static class GetPostHandler {
@PostMapping("/test")
public Flux<String> getName(@RequestPart("test") String test, @RequestPart("test2") String test2) {
return Flux.just(test,test2);
}
}
@Component
public class GetPostFilter implements WebFilter {
@Override
public Mono<Void> filter(ServerWebExchange serverWebExchange,
WebFilterChain webFilterChain) {
ServerHttpRequest req = serverWebExchange.getRequest().mutate().method(HttpMethod.POST).build();
return webFilterChain.filter( serverWebExchange.mutate().request(req).build());
}
}
结果是正确的:
12
如何创建webfilter,将传入的get请求转换为内部发布
@RestController
public static class GetPostHandler {
@PostMapping("/test")
public Flux<String> getName(@RequestPart("test") String test, @RequestPart("test2") String test2) {
return Flux.just(test,test2);
}
}
@Component
public class GetPostFilter implements WebFilter {
@Override
public Mono<Void> filter(ServerWebExchange serverWebExchange,
WebFilterChain webFilterChain) {
ServerHttpRequest req = serverWebExchange.getRequest().mutate().method(HttpMethod.POST).build();
return webFilterChain.filter( serverWebExchange.mutate().request(req).build());
}
}
结果是正确的:
12
请发布一个工作示例,说明它不起作用。我发布了代码,显示测试不起作用。如果你改变GET-to-POST,每件事都会像一个符咒一样起作用。我会对你的请求回答“可能不会”,为什么有人想在GET请求中发送一具尸体对我来说是疯狂的好运(如果你不决定真的修复这个糟糕的遗产,你可能需要它)@ThomasAndolf thnaks,非常感谢你。我只是想确保我正确理解了这个spring GET行为。我将努力解决这个问题。谢谢。请发布一个工作示例,说明它不起作用。我发布了代码,显示测试不起作用。如果你改变GET-to-POST,每件事都会像一个符咒一样起作用。我会对你的请求回答“可能不会”,为什么有人想在GET请求中发送一具尸体对我来说是疯狂的好运(如果你不决定真的修复这个糟糕的遗产,你可能需要它)@ThomasAndolf thnaks,非常感谢你。我只是想确保我正确理解了这个spring GET行为。我将努力解决这个问题。谢谢,非常感谢你!这管用!我以前测试过它,但它不起作用,因为我不知道TestRestTemplate不会在GET时向请求添加负载。我被迫添加自定义测试配置,以允许TestRestTeamplate获得有效负载。要配置TestRestTemplate,需要导入自定义测试配置,其中TestRestTemplateBuilder由自定义SimpleClientHttpRequestFactory#prepareConnection提供支持。这就是我添加curl代码段的原因:)它取决于http客户端。但由于您有遗留的一个,我想您将使用curl来测试谢谢,非常感谢!这管用!我以前测试过它,但它不起作用,因为我不知道TestRestTemplate不会在GET时向请求添加负载。我被迫添加自定义测试配置,以允许TestRestTeamplate获得有效负载。要配置TestRestTemplate,需要导入自定义测试配置,其中TestRestTemplateBuilder由自定义SimpleClientHttpRequestFactory#prepareConnection提供支持。这就是我添加curl代码段的原因:)它取决于http客户端。但由于您有遗留的一个,我认为您将使用curl进行测试