【问题标题】:Sending POST params with Netty and why isn't DefaultHttpDataFactory not in the releases?使用 Netty 发送 POST 参数,为什么 DefaultHttpDataFactory 不在版本中?
【发布时间】:2023-04-04 23:31:01
【问题描述】:
HttpRequest httpReq=new DefaultHttpRequest(HttpVersion.HTTP_1_1,HttpMethod.POST,uri);
httpReq.setHeader(HttpHeaders.Names.HOST,host);
httpReq.setHeader(HttpHeaders.Names.CONNECTION,HttpHeaders.Values.KEEP_ALIVE);
httpReq.setHeader(HttpHeaders.Names.ACCEPT_ENCODING,HttpHeaders.Values.GZIP);
String params="a=b&c=d";
ChannelBuffer cb=ChannelBuffers.copiedBuffer(params,Charset.defaultCharset());
httpReq.setHeader(HttpHeaders.Names.CONTENT_LENGTH,cb.readableBytes());
httpReq.setContent(cb);

不产生有效的请求。发送发布请求的正确方法是什么,最好是手动构造参数数据,而不是使用 DataFactory。另外,为什么 HttpDataFactory 不包含在任何版本中?

【问题讨论】:

    标签: java http netty


    【解决方案1】:

    你写的都是对的,加httpReq.setHeader(HttpHeaders.Names.CONTENT_TYPE,"application/x-www-form-urlencoded"); 你的例子会起作用。对于更复杂的代码,您需要添加 url 编码。

    【讨论】:

      【解决方案2】:
      DefaultFullHttpRequest request = new DefaultFullHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.POST, uri.toASCIIString());
      request.headers().set(HttpHeaders.Names.HOST, ip);
      request.headers().set(HttpHeaders.Names.CONTENT_TYPE,"application/x-www-form-urlencoded");
      List<NameValuePair> nvps = new ArrayList<NameValuePair>();
      nvps.add(new BasicNameValuePair(param.getKey(), param.getValue()));
      HttpEntity httpEntity = new UrlEncodedFormEntity(nvps);
      ByteBuf byteBuf = 
      Unpooled.copiedBuffer(EntityUtils.toByteArray(httpEntity));
      request.content().writeBytes(byteBuf);
      request.headers().set(HttpHeaders.Names.CONTENT_LENGTH,request.content().readableBytes());
      fu.channel().writeAndFlush(request)
      

      【讨论】:

        猜你喜欢
        • 2011-09-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-13
        • 2016-01-25
        • 1970-01-01
        • 2021-06-30
        • 1970-01-01
        相关资源
        最近更新 更多