当前位置: 首页 > 知识库问答 >
问题:

如何在HTTP请求中发送java对象?

陆宏壮
2023-03-14

我正在制作一个文本游戏,需要将一个对象(地点)上传到Java web服务器。(玩家需要共享数据,但这里不关心安全性)我正在使用java。网http API。我目前的方法是

public void sendNewPlace(Place place) {
    HttpRequest.BodyPublisher publisher =
            HttpRequest.BodyPublishers.ofInputStream(() ->  {
                PipedInputStream in = new PipedInputStream();

                ForkJoinPool.commonPool().submit(() -> {
                    try (PipedOutputStream out = new PipedOutputStream(in)) {
                        return place;
                    }
                });

                return in;
            });
    HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create("http://127.0.0.1:410/Places/Send/"))
            .POST(publisher)
            .build();
    try {
        client.send(request, HttpResponse.BodyHandlers.discarding());
    } catch (IOException | InterruptedException e) {
        System.out.println("Error: " + e + ", please contact game admin.");
    }
}

但这会抛出java。伊奥。IOException:分块传输编码,状态:在客户端上读取_LENGTH。send()。我真的不知道该怎么解决这个问题,所有的教程和StackOverflow问题要么使用大量的第三方API,要么使用过时的代码(java 9之前的版本),要么想要发送字符串或int之类的东西。这些都是无益的。我不太确定这段代码是做什么的,我在一个教程或问题中找到了它,并对其进行了修改。我想我不想尝试使用JSON,我试图不使用第三方库。如果你想知道,我的服务器代码如下:

    public void makePlacesRecieveContext() {
        server.createContext("/Places/Send/", new HttpHandler() {
            public void handle(HttpExchange exchange) throws IOException {
                System.out.println("Hit! /Places/Send/");
                exchange.sendResponseHeaders(200, 0);
                ObjectInputStream out = new ObjectInputStream(exchange.getRequestBody());
                try {
                    Place pl = (Place)out.readObject();
                    GetResponces.writeFile(new File("C://Users//programmerGuy//gameServer//Places//" + pl.getName()),pl);
                } catch (ClassNotFoundException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                out.close();
                exchange.getRequestBody().close();
                System.out.println(exchange.getRemoteAddress().getHostName() + " : " + exchange.getRemoteAddress().getHostString());
            }
        });
    }

GetResponces是我为处理大多数文件IO而构建的类。我需要做的就是把这些Place对象html" target="_blank">上传到服务器上,我的问题是,我该怎么做?

编辑:我的新客户代码是:

            public void sendNewPlace(Place place) {

    HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create("http://127.0.0.1:410/Places/Send/"))
            .POST(BodyPublishers.ofString(new Gson().toJson(place)))
            .build();
    try {
        client.send(request, HttpResponse.BodyHandlers.discarding());
    } catch (IOException | InterruptedException e) {
        System.out.println("Error: " + e + ", please contact game admin.");
    }
}

如果服务器端代码与此有关,则如下所示:

    public void makePlacesRecieveContext() {
    server.createContext("/Places/Send/", new HttpHandler() {
        public void handle(HttpExchange exchange) throws IOException {
            System.out.println("Hit! /Places/Send/");
            exchange.sendResponseHeaders(200, 0);
            String byteString = new String(exchange.getRequestBody().readAllBytes());
            Place p = new Gson().fromJson(byteString, Place.class);
            GetResponces.writeFile(new File(System.getProperty("user.home") + "/webServer/places/" + p.getName() + ".place"), p);
            System.out.println(exchange.getRemoteAddress().getHostName() + " : " + exchange.getRemoteAddress().getHostString());
        }
    });
}

由于某种原因,我的错误保持不变...我的客户端代码是println-ing错误:java.io.IO异常:分块传输编码,状态:READING_LENGTH,请联系游戏管理员。

编辑3:完整的错误如下:(我试图使用扰流板,我希望它能工作)java.io.异常:分块传输编码,状态:READING_LENGTH在java.net.http/jdk.internal.net.http.HttpClientImpl.send(HttpClientImpl.java:565)在java.net.http/jdk.internal.net.http.HttpClientFacade.send(HttpClientFacade.java:119)在HttpClients. HttpPlaceClient.sendNewPlace(HttpPlaceClient.java:53)在txtGame. Modules.makeNewPlace(Modules.java:117)在txtGame. Player.(Player.java:38)在txtGame. Main.(Main.java:16)在txtGame.Main.main(Main.java:99)引起的:java.io.IO异常:分块传输编码,状态:READING_LENGTH在java.net.http/jdk.internal.net.http.common.Utils.wrapWithExtraDetail(Utils.java:294)在java.net.http/jdk.internal.net.http.Http1Response$BodyReader.onReadError(Http1Response.java:741)在java.net.http/jdk.internal.net.http.Http1AsyncReceiver.checkForErrors(Http1AsyncReceiver. java: 297)在java. net. http/jdk. interal. net. http. Http1AsyncReceiver. flush(Http1AsyncReceiver. java: 263)在java. net. http/jdk. interal. net. http.公共。SequentialScheduler$SynChronizedRestartableTask. run(SequentialScheduler. java: 175)在java. net. http/jdk. interal. net. http.公共。SequentialScheduler$CompleteRestartableTask. run(SequentialScheduler. java: 147)在java. net. http/jdk. interal. net. http.公共。在java. net. http/jdk. interal. net. http. Sockettube$InternalReadPublisher$ReadSubcript. signal办案(SocketTube. java: 632)在java. net. http/jdk. interal. net. http. SocketTub$InternalReadPublisher$ReadSubcript. signal办案(SocketTub. java: 632)在java. net. http/jdk. interal. net. http. SocketTub$InternalReadPublisher$InternalReadSubcript. read(SocketTub. java: 833)在java. net. http/jdk. interal. net. http.

注意!!!:如果您能帮我把这个问题缩短一些(如果有剧透的话),我们将不胜感激

共有1个答案

苍阳成
2023-03-14

首先,你必须通过

实现java。伊奥。可序列化

然后,需要将Place对象转换为json对象,这可以通过使用Jackson或GSON库轻松完成。

使用Gson的示例:

Gson gson = new Gson();
String json = gson.toJson(placeObject);

稍后,当收到响应时,您可以使用相同的库将其反序列化回Place对象。

Place placeObject = new Gson().fromJson(json, Place.class);
 类似资料:
  • 问题内容: 在Java中,如何编写HTTP请求消息并将其发送到HTTP WebServer? 问题答案: 你可以使用。 示例(从此处开始),进行了改进。包括在链接腐烂的情况下:

  • 问题内容: 我有Restful Web服务,我发送POST和GET HTTP请求,以及如何使用JAVA在httpURLConection中发送PUT和DELTE请求HTTP。 问题答案: 放 删除

  • 问题内容: 我正在尝试使用node.js将http请求发送到neo4j数据库。这是我正在使用的代码: 我检查数据库是否正在运行(我已连接到管理网页,并且一切正常。)恐怕问题不在数据库方面,而在node.js方面。 我希望有人可以对此问题有所启发。我想学习如何在node.js中发送http请求,答案不必特定于neo4j问题。 提前致谢 问题答案: 如果是简单的GET请求,则应使用 否则,需要关闭。

  • 问题内容: 我在这里尝试做的是获取给定URL的标头,以便确定MIME类型。我希望能够查看是否http://somedomain/foo/将返回例如HTML文档或JPEG图像。因此,我需要弄清楚如何发送HEAD请求,以便无需下载内容就可以读取MIME类型。有人知道这样做的简单方法吗? 问题答案: 使用。 还有一个getheader(name)获取特定的标头。

  • 问题内容: 我想知道是否可以将PUT,DELETE请求(实际上)发送java.net.HttpURLConnection到基于HTTP的URL。 我已经读了很多描述如何发送GET,POST,TRACE,OPTIONS请求的文章,但是我仍然没有找到成功执行PUT和DELETE请求的示例代码。 问题答案: 要执行HTTP PUT: 要执行HTTP删除:

  • 很多时候我们需要在页面打开的时候,读取远程的内容,然后在当前页面显示. 这就需要用到 http请求了. vue页面调用http请求 vuejs 内置了对发送http请求的支持. 只需要在对应页面的script 标签内加上对应的代码就好. 例如: 我们新增一个页面,叫 "博客列表页" : src/components/BlogList.vue, 内容如下: <template> <div >