Pranith Sriram
Pranith Sriram

Reputation: 11

Unale to Call another api which accepts Http2 from Spring-Boot

  1. Unable to invoke HTTP/2 API call from Spring Boot application

  2. 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

Answers (1)

Pranith Sriram
Pranith Sriram

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

Related Questions