es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo puedo evitar que java.net.http.HttpClient haga una solicitud de actualización?

Al realizar una llamada desde un proyecto de Java a una API REST de Python, me encuentro con un error que dice “Solicitud de actualización no compatible”. Estoy haciendo una simple solicitud GET desde Java al punto final escrito en Python, y en algún momento Java decide que quiere solicitar una actualización de la conexión a un websocket. Mi problema es que nunca hago referencia a los websockets en mi proyecto de Java, y cuando depuro y veo el valor de los encabezados en la solicitud, no muestra ningún encabezado en absoluto, pero en algún punto antes de llegar a la red decide que quiere hacer una solicitud de actualización. Todavía no he analizado mi propio tráfico para confirmar la existencia del encabezado; pero el problema no existe cuando uso OKHTTP en lugar de java.net.http.HttpClient.

Este código resulta en el error de “Solicitud de actualización no compatible” devuelto por la API de Python.

HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create("http://127.0.0.1:8000/"))
    .method("GET", HttpRequest.BodyPublishers.noBody())
    .build();
HttpResponse<string> response = HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());

Este código funciona perfectamente bien:

OkHttpClient client = new OkHttpClient();

Request request = new Request.Builder()
  .url("http://127.0.0.1:8000/")
  .get()
  .build();

Response response = client.newCall(request).execute();

¿Alguien está familiarizado con cómo desactivar la solicitud de actualización en el cliente HTTP nativo que proporciona Java?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Como experto en TI especializado en Java, REST, HTTP, Websocket y Java-HTTP-Client, sugeriría intentar los siguientes pasos para desactivar la solicitud de actualización en el cliente HTTP nativo proporcionado por Java:

    1. Establecer explícitamente el encabezado Connection en keep-alive en tu código Java antes de enviar la solicitud:
      HttpRequest request = HttpRequest.newBuilder()
         .uri(URI.create("http://127.0.0.1:8000/"))
         .method("GET", HttpRequest.BodyPublishers.noBody())
         .header("Connection", "keep-alive")
         .build();
      HttpResponse<string> response = HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString());
      System.out.println(response.body());
      
    2. Si establecer el encabezado Connection no funciona, intenta desactivar el manejo automático de redirecciones en el cliente HTTP:
      HttpClient client = HttpClient.newBuilder()
         .followRedirects(HttpClient.Redirect.NEVER)
         .build();
      HttpRequest request = HttpRequest.newBuilder()
         .uri(URI.create("http://127.0.0.1:8000/"))
         .method("GET", HttpRequest.BodyPublishers.noBody())
         .build();
      HttpResponse<string> response = client.send(request, HttpResponse.BodyHandlers.ofString());
      System.out.println(response.body());
      
    3. Si ninguno de los pasos anteriores funciona, siempre puedes cambiar a utilizar una biblioteca de cliente HTTP diferente como OKHTTP, como se menciona en la pregunta original.

Comments are closed.