【问题标题】:Get POST Content from HttpServletRequest从 HttpServletRequest 获取 POST 内容
【发布时间】:2019-03-29 20:17:37
【问题描述】:

我想从 Java Servlet 中的 POST 请求中读取数据。该 servlet 作为服务在 Geoserver 上运行并使用 URL 调用。


POST 请求(使用 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?

EDIT1:

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

编辑2:

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

【问题讨论】:

  • 我认为你应该使用while(s.hasNext()) { System.out.println(s.next()); }
  • Nothing...我认为我在 java 中的请求不存在正文,因为如果我检查一行,我会得到错误。但是为什么它存在于我的帖子和我的服务器上我只得到标题

标签: java http post servlets


【解决方案1】:
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) {
                   ...
                }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-27
    • 2011-12-02
    • 2011-04-19
    • 1970-01-01
    • 2019-03-01
    • 1970-01-01
    • 2018-02-07
    • 1970-01-01
    相关资源
    最近更新 更多