Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在SpringWebFlux控制器中接收GET请求的多部分或有效负载数据_Java_Spring_Spring Webflux - Fatal编程技术网

Java 如何在SpringWebFlux控制器中接收GET请求的多部分或有效负载数据

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 {

我们目前正在使用WebFlux将一些遗留服务重写为spring框架。因为遗留逻辑允许在GET请求时接收有效负载或多部分数据,所以我们需要在新服务中重新创建该行为

WebFlux不允许我们在Get请求的情况下接收有效负载或多部分数据。我在@RestController和@Controller中测试了这种行为。是否可以更改web flux的配置以处理此类情况

UploadFileController示例:

@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进行测试