Unale 调用另一个接受来自 Spring-Boot 的 Http2 的 api

问题描述 投票:0回答:1
  1. 无法从springboot调用Http2 api调用

  2. 我无法调用版本为 HTTP/2 的 POST Http 请求。请帮忙解决这个问题。

这是我对 POST 请求的方法调用

public static void main(String[] args) 抛出异常 {

    SpringApplication.run(Http2demoApplication.class, args);
    postApiCall("http://192.XXX.0.XXX:XXX/XXX/v1/XXX");
    
}


public static boolean postApiCall(String url) throws Exception {

    HttpClient httpClient = newHttpClient();

    HttpRequest httpRequest = HttpRequest.newBuilder()
            .version(HttpClient.Version.HTTP_2)
            .uri(new URI(url))
            .header("Content-Type", "application/json")
            .header( "Accept", "application/json" )
            .POST(HttpRequest.BodyPublishers.ofFile(new File("C:\\Users\\XXX\\Desktop\\test.json").toPath()))
            .build();
    httpClient.send(httpRequest, HttpResponse.BodyHandlers.ofString());

    return true;
}

application.properties 文件有 server.http2.enabled=true

错误:

线程“main”中的异常 java.io.IOException:HTTP/1.1 标头解析器未收到任何字节 在 java.net.http/jdk.internal.net.http.HttpClientImpl.send(HttpClientImpl.java:586) 在 java.net.http/jdk.internal.net.http.HttpClientFacade.send(HttpClientFacade.java:119) 在 com.shabodi.sample.http2demo.Http2demoApplication.postApiCall(Http2demoApplication.java:35) 在 com.shabodi.sample.http2demo.Http2demoApplication.main(Http2demoApplication.java:19) 引起:java.io.IOException:HTTP/1.1标头解析器未收到字节 在 java.net.http/jdk.internal.net.http.common.Utils.wrapWithExtraDetail(Utils.java:348) 在 java.net.http/jdk.internal.net.http.Http1Response$HeadersReader.onReadError(Http1Response.java:675) 在 java.net.http/jdk.internal.net.http.Http1AsyncReceiver.checkForErrors(Http1AsyncReceiver.java:302) 在 java.net.http/jdk.internal.net.http.Http1AsyncReceiver.flush(Http1AsyncReceiver.java:268) 在 java.net.http/jdk.internal.net.http.common.SequentialScheduler$LockingRestartableTask.run(SequentialScheduler.java:205) 在 java.net.http/jdk.internal.net.http.common.SequentialScheduler$CompleteRestartableTask.run(SequentialScheduler.java:149) 在 java.net.http/jdk.internal.net.http.common.SequentialScheduler$SchedulableTask.run(SequentialScheduler.java:230) 在 java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) 在 java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) 在 java.base/java.lang.Thread.run(Thread.java:833) 引起原因:java.io.EOFException:读取时到达 EOF 在 java.net.http/jdk.internal.net.http.Http1AsyncReceiver$Http1TubeSubscriber.onComplete(Http1AsyncReceiver.java:596) 在 java.net.http/jdk.internal.net.http.SocketTube$InternalReadPublisher$ReadSubscription.signalCompletion(SocketTube.java:640) 在 java.net.http/jdk.internal.net.http.SocketTube$InternalReadPublisher$InternalReadSubscription.read(SocketTube.java:845) 在 java.net.http/jdk.internal.net.http.SocketTube$SocketFlowTask.run(SocketTube.java:181) 在 java.net.http/jdk.internal.net.http.common.SequentialScheduler$SchedulableTask.run(SequentialScheduler.java:230) 在 java.net.http/jdk.internal.net.http.common.SequentialScheduler.runOrSchedule (SequentialScheduler.java:303) 在 java.net.http/jdk.internal.net.http.common.SequentialScheduler.runOrSchedule (SequentialScheduler.java:256) 在 java.net.http/jdk.internal.net.http.SocketTube$InternalReadPublisher$InternalReadSubscription.signalReadable(SocketTube.java:774) 在 java.net.http/jdk.internal.net.http.SocketTube$InternalReadPublisher$ReadEvent.signalEvent(SocketTube.java:957) 在 java.net.http/jdk.internal.net.http.SocketTube$SocketFlowEvent.handle(SocketTube.java:253) 在 java.net.http/jdk.internal.net.http.HttpClientImpl$SelectorManager.handleEvent(HttpClientImpl.java:979) 在 java.net.http/jdk.internal.net.http.HttpClientImpl$SelectorManager.lambda$run$3(HttpClientImpl.java:934) 在 java.base/java.util.ArrayList.forEach(ArrayList.java:1511) 在 java.net.http/jdk.internal.net.http.HttpClientImpl$SelectorManager.run(HttpClientImpl.java:934)

spring-boot protocols http2
1个回答
1
投票

如果我使用此代码,问题就解决了:

import reactor.netty.http.client.HttpClient;
import reactor.netty.http.HttpProtocol;
import org.springframework.web.reactive.function.client.WebClient;
             
WebClient webClient = WebClient.create()
   .mutate()
   .clientConnector(new ReactorClientHttpConnect(HttpClient.create()
   .protocol(HttpProtocol.H2C)))
   .baseUrl(url).build();
                
String response = webClient.post()
    .header("content-type","application/json") 
    .bodyValue(jasonData)
    .retrieve()
    .bodyToMono(String.class)
    .block();
© www.soinside.com 2019 - 2024. All rights reserved.