Не удалось получить тело запроса POST - PullRequest
0 голосов
/ 07 апреля 2020

Я пытаюсь получить JSON из тела метода запроса (используя бессонницу / почтальона), но у меня нет прогресса в этом. Я сделал класс с именем PlayerData, который имеет только один атрибут (userId). Я использую библиотеку Джексона для использования метода readValue, чтобы сопоставить мое json тело с моим java классом PlayerData. Чтобы увидеть, что происходит, у меня есть журнал печати и точки останова для отладки того, что может быть, но по какой-то причине они оба пропускаются моим кодом. Я не возвращаю ответ, потому что в этом случае я не хочу. Идея здесь состоит только в том, чтобы установить экземпляр PlayerData с userId из запроса тела, без необходимости сохранять данные на диске.

PlayerData.class

package com.pipa.api;

import lombok.Builder;
import lombok.Value;

@Value
@Builder
public class PlayerData {
  private Integer userId;
}

Приложение. java

package com.pipa.api;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.sun.net.httpserver.HttpServer;

import java.io.IOException;
import java.io.OutputStream;
import java.net.InetSocketAddress;

public class Application {

    private static ObjectMapper objectMapper;

    public static void main(String[] args) throws IOException {
        int serverPort = 8000;
        HttpServer server = HttpServer.create(new InetSocketAddress(serverPort), 0);

        server.createContext("/post", (exchange -> {
            if ("POST".equals(exchange.getRequestMethod())) {
                PlayerData playerData = objectMapper.readValue(exchange.getRequestBody(), PlayerData.class);
                System.out.println("this print never appear");
            } else {
                exchange.sendResponseHeaders(405, -1); // 405 Method Not Allowed
            }

            exchange.close();
        }));

        server.setExecutor(null); // creates a default executor
        server.start();
    }
}

Ответы [ 2 ]

0 голосов
/ 07 апреля 2020

Есть 2 проблемы с кодом.

  1. private static ObjectMapper objectMapper; никогда не инициализируется. Поэтому вы получите NullPointerException. Попробуйте private static ObjectMapper objectMapper = new ObjectMapper();

  2. Используя Lombok и Jackson, вам может потребоваться внести изменения, как указано в этой ссылке

0 голосов
/ 07 апреля 2020

В строке что-то происходит objectMapper.readValue(exchange.getRequestBody(), PlayerData.class);

exchange.getRequestBody() возвращает экземпляр InputStream. Я пытался преобразовать InputStream в строку, и она работала нормально. Я также использовал net .sf. json .JSONObject , чтобы проанализировать строку JSON и затем преобразовать ее в объект класса PlayerData. Если вы используете этот подход, выполнение кода переходит к последнему оператору печати. ​​

            InputStream inputStream = exchange.getRequestBody();
            StringWriter writer = new StringWriter();
            IOUtils.copy(inputStream, writer );
            String theString = writer.toString();
            System.out.println(theString);
            JSONObject jsonObject = JSONObject.fromObject(theString);
            PlayerData pd = (PlayerData) JSONObject.toBean(jsonObject, PlayerData.class);
            System.out.println(pd.toString());

Это просто обходной путь, поскольку я до сих пор не понимаю причину проблемы с objectMapper.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...