Ошибка с «преждевременным концом тела сообщения с разделением по длине (ожидаемое: 349; полученное: 0)» - PullRequest
1 голос
/ 01 октября 2019

При выполнении запроса POST к серверу, и я вызываю readEntity, я получаю сообщение об ошибке «Преждевременное завершение тела сообщения с разделителями-длинами (ожидается: 349; получено: 0)».

Сначала я думал, что сервер возвращает мне 0 байтов, но при отправке того же запроса через почтальона, возвращение происходит правильно. Я также перехватил сетевые пакеты с помощью WireShark, и в пакетах я увидел, что заголовок находится в одном пакете, а тело - в другом. Я не знаю, будет ли это проблемой. Еще одна вещь, которую я заметил, заключается в том, что соединение прерывается с помощью RST, как показано ниже:

https://i.ibb.co/MSGhHJM/Wire-Shark.png

Ниже приведены фрагменты кода, где строка, в которой возникает ошибка: params = post.readEntity(HashMap.class);

Импорт класса конфигурации:

import com.google.inject.Inject;
import org.jose4j.json.internal.json_simple.JSONArray;

import javax.ws.rs.core.Response;
import java.util.HashMap;

Класс конфигурации:

public void configure(SchedulerModule module, SessionInfo session) {
    Response post = connection.post(session, ServiceURL.CONFIG_URL, new JSONArray());
    params = post.readEntity(HashMap.class); // Linha que o erro ocorre
    if ("R".equals(params.get("IE_TIPO")) && validaInteger(params.get("QT_INTERVALO")) > 0) {
        module.setDelay(validaInteger(params.get("QT_INTERVALO")));
        module.setRate(validaInteger(params.get("QT_INTERVALO")));
        isRun = true;
    } else {
        isRun = false;
    }
}

Импорт класса подключения:

import com.google.inject.Inject;
import com.google.inject.name.Named;
import org.jose4j.json.internal.json_simple.JSONArray;
import org.jose4j.json.internal.json_simple.JSONObject;

import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Entity;
import javax.ws.rs.client.Invocation;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import java.util.stream.Collectors;

Метод класса подключения:

public Response post(SessionInfo sessionInfo, ServiceURL url, JSONArray array) {
    Client client = ClientBuilder.newClient();
    try {
        Invocation.Builder builder = client.target(backendUrl).path(url.getUrl())
                .request(MediaType.APPLICATION_JSON_TYPE)
                .header("idSessao", sessionInfo.getIdSessao())
                .header("crsfToken", sessionInfo.getCrsfToken())
                .header("Cookie", sessionInfo.getCookieHeader());

        return builder.post(Entity.entity(array == null ? "[]" : array.toString(), MediaType.APPLICATION_JSON_TYPE));
    } catch (Exception e) {
        System.out.println("Failure" + e.getMessage());
    } finally {
        client.close();
    }
    return null;
}

Мне нужно получить тело возврата этого запроса. Вы можете мне помочь?

...