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

从HttpServletRequest获取POST内容

颜森
2023-03-14

我想从Java Servlet的POST请求中读出数据。这个servlet在Geoserver上作为服务运行,用URL调用。

发布请求(使用python脚本创建):

POST http://localhost:8080/geoserver/ows?request=upload&service=GeoTransfer&version=1.0.0 HTTP/1.1
Host: localhost:8080
User-Agent: python-requests/2.20.0
Accept-Encoding: gzip, deflate
Accept: application/xml
Connection: keep-alive
Authorization: admin:admin
fileName: transfer.xml
Content-Type: application/xml
Content-Length: 489

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<transfer>
  <enviroment>Test</enviroment>
  <product>Testproduct</product>
  <user>admin</user>
</transfer>

Java servlet:

public void upload(HttpServletRequest request, httpServletResponse response)
            throws ServletException, IOException {

        System.out.println("===== Begin headers =====");
        Enumeration<String> names = request.getHeaderNames();
        while (names.hasMoreElements()) {
            String headerName = names.nextElement();
            System.out.println(headerName + " = " + request.getHeader(headerName));
        }
        System.out.println("===== End headers =====\n");


        System.out.println("===== Begin Body =====");
        if ("POST".equalsIgnoreCase(request.getMethod())) {

            try {
                Scanner s = new Scanner(request.getInputStream(), "UTF-8").useDelimiter("\\A");
                System.out.println(s.hasNext() ? s.next() : "");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        System.out.println("===== End Body =====\n");

 }

输出:

===== Begin headers =====
Authorization = admin:admin
fileName = transfer.xml
Accept = application/xml
User-Agent = python-requests/2.20.0
Connection = keep-alive
Host = localhost:8080
Accept-Encoding = gzip, deflate
Content-Length = 489
Content-Type = application/xml
===== End headers =====

===== Begin Body =====

===== End Body =====

问题:

为什么我不能读出xml数据体?请求有问题,数据没有传递给Java吗?

编辑1:

使用Inputstream尝试其他方法,但正文始终是空行。可能是服务器在创建请求对象时忽略了Body并仅使用头的问题吗?

编辑2:

尝试Majid Khakwani回答并获得空字符串。我打印出request.getContentLength(),它是489。该方法是从标题中获取这个数字还是从对象请求中获取内容的真实长度?

共有1个答案

祁嘉木
2023-03-14
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
                String xml = null;
                try {
                        byte[] xmlData = new byte[request.getContentLength()];

                        //Start reading XML Request as a Stream of Bytes
                        InputStream sis = request.getInputStream();
                        BufferedInputStream bis = new BufferedInputStream(sis);

                        bis.read(xmlData, 0, xmlData.length);

                        if (request.getCharacterEncoding() != null) {
                                xml = new String(xmlData, request.getCharacterEncoding());
                        } else {
                                xml = new String(xmlData);
                        }
                        //xml and xmlData contains incomplete data
                } catch (IOException ioe) {
                   ...
                }
 类似资料:
  • 问题内容: 我正在HTTP POST到URL http:// laptop:8080 / apollo / services / rpc?cmd = execute 与POST数据 Http请求的为 如何从获取POST数据? 如果我枚举请求参数,则只能看到一个参数“ cmd”,而看不到POST数据。 问题答案: 通常,你可以以相同的方式在Servlet中获取GET和POST参数: 但仅当POST数

  • 我开始学习Netty 4 Http服务器,但我已经遇到了一个问题。如何以最简单的方式从POST请求中获取内容? 我在浏览Netty的文档,但很复杂。 提前道谢! 编辑:我正在使用这个代码接收数据。 正如您所看到的,有三条注释行返回给我一个异常:

  • 问题内容: 是否可以从ServletContext获取HttpServletRequest? 问题答案: 是否可以从ServletContext获取HttpServletRequest? 没有。 该代表的应用程序。该应用程序可以涵盖许多会话和请求。但是您无法通过来获取“当前正在运行”的请求或会话。有关servlet和作用域如何工作的详细信息,可以在以下相关答案中找到:servlet如何工作?实例化

  • 本文向大家介绍java通过HttpServletRequest获取post请求中的body内容的方法,包括了java通过HttpServletRequest获取post请求中的body内容的方法的使用技巧和注意事项,需要的朋友参考一下 在java web应用中,我们如何获取post请求body中的内容?以及需要注意的问题。 通常利用request获取参数可以直接通过req.getParameter

  • 问题内容: 我有一个接收HttpServletRequest的Filter,该请求是一个POST,其中包含我需要读入我的filter方法的xml。从HttpServletRequest对象获取发布的xml的最佳方法是什么。 问题答案: 这取决于客户端的发送方式。 如果已将其作为原始请求正文发送,则使用: 如果已将其作为常规请求参数发送,请使用: 如果已将其作为具有部分风味的上载文件发送,请使用。

  • 我想从请求和响应中获得XML数据,并将其用于Rest控制器。我试过这个: 但我得到 将内容转换成字符串变量的正确方法是什么?