无法从springboot调用Http2 api调用
我无法调用版本为 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)
如果我使用此代码,问题就解决了:
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();