Http Post没有发布数据

时间:2011-08-25 20:27:17

标签: java http sockets telnet

我正在尝试使用套接字从Java客户端发布一些数据。它与运行php代码的localhost进行了对话,它只是将发送给它的post params吐出来。

这是Java客户端:

 public static void main(String[] args) throws Exception {

       Socket socket = new Socket("localhost", 8888);
       String reqStr = "testString";

        String urlParameters = URLEncoder.encode("myparam="+reqStr, "UTF-8");
        System.out.println("Params: " + urlParameters);

        try {
            Writer out = new OutputStreamWriter(socket.getOutputStream(), "UTF-8");
            out.write("POST /post3.php HTTP/1.1\r\n");  
            out.write("Host: localhost:8888\r\n"); 
            out.write("Content-Length: " + Integer.toString(urlParameters.getBytes().length) + "\r\n");
            out.write("Content-Type: text/html\r\n\n");
            out.write(urlParameters);  
            out.write("\r\n");  
            out.flush();

            InputStream inputstream = socket.getInputStream();
            InputStreamReader inputstreamreader = new InputStreamReader(inputstream);
            BufferedReader bufferedreader = new BufferedReader(inputstreamreader);

            String string = null;
            while ((string = bufferedreader.readLine()) != null) {
               System.out.println("Received " + string);
            }

       } catch(Exception e) {
           e.printStackTrace();
       } finally {
         socket.close(); 
       }
 }

这就是post3.php的样子:

<?php

$post = $_REQUEST;

echo print_r($post, true);
?>

我希望看到一个数组(myparams =&gt;“testString”)作为响应。但它没有将post args传递给服务器。 输出结果如下:

Received HTTP/1.1 200 OK
Received Date: Thu, 25 Aug 2011 20:25:56 GMT
Received Server: Apache/2.2.17 (Unix) mod_ssl/2.2.17 OpenSSL/0.9.8r DAV/2 PHP/5.3.6
Received X-Powered-By: PHP/5.3.6
Received Content-Length: 10
Received Content-Type: text/html
Received 
Received Array
Received (
Received )

仅供参考,此设置适用于GET请求。

有什么想法在这里发生?

3 个答案:

答案 0 :(得分:1)

正如Jochen和chesles正确地指出的那样,你使用了错误的Content-Type:标题 - 它确实应该是application/x-www-form-urlencoded。但是还有其他一些问题......

  • 最后一个标题应该通过标题和正文之间的空行与身体分开。这应该是一个完整的CRLF(\r\n),在您的代码中它只是一个新行(\n)。这是一个彻底的协议违规,我有点惊讶你不仅从服务器得到400 Bad Request,虽然Apache在这方面可以相当宽容。
  • 您应指定Connection: close以确保您不会因打开套接字而闲逛,服务器将在请求完成后立即关闭连接。
  • 不需要最终的CRLF序列。 PHP非常智能,可以自行解决这个问题,但其他服务器语言和实现可能不是......

如果您正在使用任何处于原始状态的标准化协议,则应始终至少扫描the RFC

另外,请了解secure your Apache installs ...

答案 1 :(得分:0)

看起来您正在尝试以application / x-www-form-urlencoded格式发送数据,但是您要将Content-Type设置为text / html。

答案 2 :(得分:0)

使用

out.write("Content-Type: application/x-www-form-urlencoded\n\n");

代替。正如this page所述:

  

Content-Length和Content-Type标头至关重要,因为它们告诉Web服务器需要多少字节的数据,以及MIME类型标识的类型。

用于发送表单数据,即key=value&key2=value2格式的数据使用application/x-www-form-urlencodedvalue是否包含HTML,XML或其他数据并不重要;服务器将为您解释它,您将能够像往常一样在PHP端的$_POST$_REQUEST数组中检索数据。

或者,您可以使用相应的Content-Type标头将您的数据作为原始HTML,XML等发送,但是您必须通过阅读特殊文件php://inputretrieve the data manually in PHP:< / p>

<?php
echo file_get_contents("php://input");
?>

顺便说一句,如果你将它用于任何足够复杂的东西,我强烈建议你使用像HTTPClient这样的HTTP客户端库。