Reputation: 11
Unable to invoke HTTP/2 API call from Spring Boot application
I am unable to make an HTTP POST request which is having Version HTTP/2. Please help on resolving this issue.
My method call for the POST Request:
public static void main(String[] args) throws Exception {
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;
}
The application.properties
file has server.http2.enabled=true
Stack trace with the error:
Exception in thread "main" java.io.IOException: HTTP/1.1 header parser received no bytes
at java.net.http/jdk.internal.net.http.HttpClientImpl.send(HttpClientImpl.java:586)
at java.net.http/jdk.internal.net.http.HttpClientFacade.send(HttpClientFacade.java:119)
at com.shabodi.sample.http2demo.Http2demoApplication.postApiCall(Http2demoApplication.java:35)
at com.shabodi.sample.http2demo.Http2demoApplication.main(Http2demoApplication.java:19)
Caused by: java.io.IOException: HTTP/1.1 header parser received no bytes
at java.net.http/jdk.internal.net.http.common.Utils.wrapWithExtraDetail(Utils.java:348)
at java.net.http/jdk.internal.net.http.Http1Response$HeadersReader.onReadError(Http1Response.java:675)
at java.net.http/jdk.internal.net.http.Http1AsyncReceiver.checkForErrors(Http1AsyncReceiver.java:302)
at java.net.http/jdk.internal.net.http.Http1AsyncReceiver.flush(Http1AsyncReceiver.java:268)
at java.net.http/jdk.internal.net.http.common.SequentialScheduler$LockingRestartableTask.run(SequentialScheduler.java:205)
at java.net.http/jdk.internal.net.http.common.SequentialScheduler$CompleteRestartableTask.run(SequentialScheduler.java:149)
at java.net.http/jdk.internal.net.http.common.SequentialScheduler$SchedulableTask.run(SequentialScheduler.java:230)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
at java.base/java.lang.Thread.run(Thread.java:833)
Caused by: java.io.EOFException: EOF reached while reading
at java.net.http/jdk.internal.net.http.Http1AsyncReceiver$Http1TubeSubscriber.onComplete(Http1AsyncReceiver.java:596)
at java.net.http/jdk.internal.net.http.SocketTube$InternalReadPublisher$ReadSubscription.signalCompletion(SocketTube.java:640)
at java.net.http/jdk.internal.net.http.SocketTube$InternalReadPublisher$InternalReadSubscription.read(SocketTube.java:845)
at java.net.http/jdk.internal.net.http.SocketTube$SocketFlowTask.run(SocketTube.java:181)
at java.net.http/jdk.internal.net.http.common.SequentialScheduler$SchedulableTask.run(SequentialScheduler.java:230)
at java.net.http/jdk.internal.net.http.common.SequentialScheduler.runOrSchedule(SequentialScheduler.java:303)
at java.net.http/jdk.internal.net.http.common.SequentialScheduler.runOrSchedule(SequentialScheduler.java:256)
at java.net.http/jdk.internal.net.http.SocketTube$InternalReadPublisher$InternalReadSubscription.signalReadable(SocketTube.java:774)
at java.net.http/jdk.internal.net.http.SocketTube$InternalReadPublisher$ReadEvent.signalEvent(SocketTube.java:957)
at java.net.http/jdk.internal.net.http.SocketTube$SocketFlowEvent.handle(SocketTube.java:253)
at java.net.http/jdk.internal.net.http.HttpClientImpl$SelectorManager.handleEvent(HttpClientImpl.java:979)
at java.net.http/jdk.internal.net.http.HttpClientImpl$SelectorManager.lambda$run$3(HttpClientImpl.java:934)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
at java.net.http/jdk.internal.net.http.HttpClientImpl$SelectorManager.run(HttpClientImpl.java:934)
Upvotes: 0
Views: 659
Reputation: 11
The problem is solved, if I am using this code:
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();
Upvotes: 1