繁体   English   中英

无法获取 POST 请求正文

[英]Failing to get a POST request body

我正在尝试从请求发布方法的主体中获取 JSON(使用失眠/邮递员),但我在这方面没有进展。 我做了一个名为 PlayerData 的 class,它只有一个属性(userId)。 I'm using Jackson library to use readValue method, in order to map my json body to my java class 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();
    }
}

objectMapper.readValue(exchange.getRequestBody(), PlayerData.class);行发生了一些事情。

exchange.getRequestBody()返回 InputStream 的一个实例。 我试图将 InputStream 转换为字符串,它工作正常。 我还使用了net.sf.json.JSONObject来解析JSON字符串,然后将其转换为object的ZA2F212ED4F8EBC2CBB1. 如果您使用这种方法,代码执行将转到最后一个打印语句。

            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问题背后的原因。

代码有2个问题。

  1. private static ObjectMapper objectMapper; 永远不会被初始化。 因此你会得到 NullPointerException。 尝试private static ObjectMapper objectMapper = new ObjectMapper();

  2. 使用 Lombok 和 Jackson,您可能需要按照链接中的说明进行更改

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM