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

X如何从POST获取内容?

司马高韵
2023-03-14

我开始学习Netty 4 Http服务器,但我已经遇到了一个问题。如何以最简单的方式从POST请求中获取内容?

我在浏览Netty的文档,但很复杂。

提前道谢!

编辑:我正在使用这个代码接收数据

import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelFutureListener;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.handler.codec.http.DefaultFullHttpResponse;
import io.netty.handler.codec.http.FullHttpResponse;
import io.netty.handler.codec.http.HttpHeaders;

import static io.netty.handler.codec.http.HttpHeaders.Names.*;
import static io.netty.handler.codec.http.HttpHeaders.Values;
import io.netty.handler.codec.http.HttpRequest;
import static io.netty.handler.codec.http.HttpResponseStatus.*;
import static io.netty.handler.codec.http.HttpVersion.*;
import io.netty.handler.codec.http.multipart.HttpPostRequestDecoder;
import io.netty.handler.codec.http.multipart.InterfaceHttpData;
import java.io.IOException;
import java.util.List;

public class HttpServerHandler extends ChannelInboundHandlerAdapter
{

    @Override
    public void channelReadComplete(ChannelHandlerContext ctx)
    {
        ctx.flush();
    }

    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws IOException
    {
        if (msg instanceof HttpRequest) {
            HttpRequest req = (HttpRequest) msg;

            if (HttpHeaders.is100ContinueExpected(req)) {
                ctx.write(new DefaultFullHttpResponse(HTTP_1_1, CONTINUE));
            }
            boolean keepAlive = HttpHeaders.isKeepAlive(req);

            /*
            HttpPostRequestDecoder decoder = new HttpPostRequestDecoder(req);
            List<InterfaceHttpData> list = decoder.getBodyHttpDatas();
            for (int i = 0; i < list.size(); i++) {
                System.out.println(list.get(i));
            }
            */

            String message = "Lorem ipsum dolorem";
            byte[] byty = message.getBytes();

            FullHttpResponse response = new DefaultFullHttpResponse(HTTP_1_1, OK, Unpooled.wrappedBuffer(byty));
            response.headers().set(ACCESS_CONTROL_ALLOW_ORIGIN, "*");
            response.headers().set(CONTENT_TYPE, "text/plain; charset=utf-8");
            response.headers().set(CONTENT_LENGTH, response.content().readableBytes());

            if (!keepAlive) {
                ctx.write(response).addListener(ChannelFutureListener.CLOSE);
            } else {
                response.headers().set(CONNECTION, Values.KEEP_ALIVE);
                ctx.write(response);
            }
        }
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause)
    {
        cause.printStackTrace();
        ctx.close();
    }
}

正如您所看到的,有三条注释行返回给我一个异常:

var xmlhttp = new XMLHttpRequest();
xmlhttp.open("POST", "http://127.0.0.1:8030", true);
xmlhttp.send("json=value");

共有1个答案

戎兴言
2023-03-14

看来你把事情搞混了。解码器可能更好地放在从ServerBootstrap调用的管道初始化器中。

下面的例子摘自曼宁出版社的《网络在行动》一书:

    public class HttpDecoderEncoderInitializer
        extends ChannelInitializer<Channel> {
        private final boolean client;
        public HttpDecoderEncoderInitializer(boolean client) {
            this.client = client;
        }
        @Override
        protected void initChannel(Channel ch) throws Exception {
            ChannelPipeline pipeline = ch.pipeline();
            if (client) {
                pipeline.addLast("decoder", new HttpResponseDecoder());
                pipeline.addLast("encoder", new HttpRequestEncoder());
            } else {
                pipeline.addLast("decoder", new HttpRequestDecoder());
                pipeline.addLast("encoder", new HttpResponseEncoder());
            }
        }
    }

API文档/源代码也有一些易于遵循的HTTP示例(在示例文件夹中)。

当您将解码器放入管道时,您可以直接操作处理程序中的req对象,因为它已经从字节“解码”为HttpMessage对象。

 类似资料:
  • 我想从Java Servlet的POST请求中读出数据。这个servlet在Geoserver上作为服务运行,用URL调用。 发布请求(使用python脚本创建): Java servlet: 输出: 问题: 为什么我不能读出xml数据体?请求有问题,数据没有传递给Java吗? 编辑1: 使用Inputstream尝试其他方法,但正文始终是空行。可能是服务器在创建请求对象时忽略了Body并仅使用头

  • 我尝试做的是从同一个站点发布数据并从它创建一个新的订单(当提交按钮被点击时)。我没有任何信息在我的请求。身体,我怀疑是在我的ejs出了问题,任何反馈是非常感谢的。 我的ejs文件: 和我的js文件:

  • 问题内容: 我下载了文件作为ajax的响应。如何从内容处置中获取文件名和文件类型并显示其缩略图。我有许多搜索结果,但找不到正确的方法。 控制台输出: 问题答案: 这是我有时使用它的方式。我假设您将附件作为服务器响应提供。 我从REST服务中这样设置响应头 编辑:编辑答案以适合您的问题-使用单词代替

  • 我正在使用Jsoup HTML解析器从HTML页面提取内容。 我想提取的内容(68.00),我尝试以下: 这不起作用,因为类“oPrice”在页面中出现了44次,字符串“priceString”包含44种不同的价格。 谢谢你的帮助。

  • 如何从容器内部获取docker的容器名称? 我不能使用“inspect”,因为我必须使用容器内部的脚本从JSON url获取信息。

  • 问题内容: 我正在尝试使用Flask构建一个简单的API,现在我想在其中读取一些POSTed JSON。我使用Postman Chrome扩展程序进行POST,而我发布的JSON就是。我尝试使用以下方法读取JSON: 在浏览器上,它可以正确返回我放入GET中的UUID,但是在控制台上,它只是打印出来(我希望它可以在其中打印出来。有人知道我如何从Flask方法中获取发布的JSON吗? 问题答案: 首