我开始学习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");
看来你把事情搞混了。解码器可能更好地放在从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吗? 问题答案: 首