【问题标题】:Http listener only works with POST not GETHttp 侦听器仅适用于 POST 而不是 GET
【发布时间】:2011-05-27 09:20:11
【问题描述】:

我有一个简单的程序,无论是服务器还是客户端,都不确定它是哪一端。我打开一个端口并在其上接受消息。这可行,但昨晚当我通过 GET 而不是 POST 恢复一条消息时它崩溃了。您可能已经注意到,我对网络非常陌生。

我的传输正常(套接字的东西),但我无法阅读消息。

这是我目前使用的代码。

//read HTTp header until the message size comes in
            for(int eight = 0; eight < 8; eight++)
            {
                message = in.readLine();
                LOGGER.fatal(eight);
                LOGGER.fatal(message);

                if(message.contains("Content-Length"))
                {
                    try {

                        Pattern pattern = Pattern.compile("\\d+");
                        Matcher matcher = pattern.matcher(message);
                        while (matcher.find()) {
                            sizeInt = Integer.parseInt(matcher.group());
                                               }
                        }

                    catch (Exception e) 
                        {
                            LOGGER.fatal("size not found on header line", e);
                            //System.exit(-1);
                        }                   
                }
            }

            LOGGER.fatal(sizeInt);

            LOGGER.fatal("---------------------------");

            char[] buffer =new char[sizeInt];

            //skip blank line between header and message
            message = in.readLine();

            //read message
            int fullRead = 0;
            int thisRead = 0;
            do
            {
                thisRead = in.read(buffer, fullRead, sizeInt - fullRead);   
                LOGGER.info(fullRead + " of " + sizeInt + " bytes of message read");
                fullRead += thisRead;

            }while(fullRead != sizeInt);

我遇到的问题是 GET 方法看不到消息的大小(以字节为单位),没有它我不知道如何在没有挂起的情况下读取消息。

我正在使用 java。

谁能建议我如何编辑此代码以理解 GET 消息。

【问题讨论】:

    标签: java http post get


    【解决方案1】:

    GET 请求没有任何内容——没有什么可读的。任何数据都必须在标题/ URL 中。

    【讨论】:

    • 它是在网络上的两台计算机之间发送的消息,没有用户界面的东西,软件打开一个端口并发送消息,这就是为什么我感到困惑,因为每个人都在继续讨论 URL跨度>
    • @Skeith:如果是 HTTP 请求,则涉及 URL。 URL 独立于用户界面。
    • @Skeith:这将是您阅读的第一行。如果你想实现它,你真的应该阅读 HTTP...
    • @Skeith:你声称你“知道这一切”,但你仍然在问一些没有多大意义的问题。如果这家其他公司在他们的 GET 请求中包含数据,那么它应该 要么 在 URL 中 在标头中。查看请求以了解它是哪个。坦率地说,无论哪种方式都是不合适的。
    • @Skeith:您的程序正在充当服务器。客户端正在向您发送请求。我当然希望您正在为该请求提供响应,即使它只是一个简单的 200。同样,请从教程或 RFC 中了解 HTTP。
    【解决方案2】:

    看起来您想实现一个 HTTP 服务器(它不是客户端,因为您想读取 HTTP 请求,而不是制作它们)。如果您“对网络非常陌生”,我不会推荐它。无论如何,如果你真的想建立自己的 HTTP 服务器,网上有一些例子,例如this one。如果您的应用程序中需要 HTTP 服务器,另一种方法是使用 com.sun.net.httpserver.HttpServer(链接包含一个最小示例)。

    【讨论】:

      【解决方案3】:

      HTTP GET 没有任何内容,因此没有内容长度。此外,HTTP POST 不一定需要在 HTTP/1.1 中指定 Content-Length:HTTP Message Length

      【讨论】:

      • 这就是我的观点。我想知道如何阅读 GET 消息的内容,因为它没有显示在听众中并且没有正文。
      • @Skeith:“GET 消息的内容”有点矛盾(正如很多人指出的那样)。 GET 请求只有第一行(url 和 HTTP 版本)和后续行中的后续标头。就是这样。此外,POST 中的 Content-Length 在技术上是一个 MIME 标头,如果用于表示内容的长度(无标头)。
      • @pap 你会用什么词来指代我正在发送的 XML?必须有某种“内容”,否则所有 GET 消息都将为空且不包含数据。
      • @Skeith:确实,他们没有任何身体。他们只有 URL 和标题。就是这样。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-18
      • 2014-03-16
      • 1970-01-01
      • 1970-01-01
      • 2014-07-23
      • 2015-06-02
      • 2017-08-09
      相关资源
      最近更新 更多