簡體   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