我正在尝试使用套接字从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请求。
有什么想法在这里发生?
答案 0 :(得分:1)
正如Jochen和chesles正确地指出的那样,你使用了错误的Content-Type:
标题 - 它确实应该是application/x-www-form-urlencoded
。但是还有其他一些问题......
\r\n
),在您的代码中它只是一个新行(\n
)。这是一个彻底的协议违规,我有点惊讶你不仅从服务器得到400 Bad Request
,虽然Apache在这方面可以相当宽容。Connection: close
以确保您不会因打开套接字而闲逛,服务器将在请求完成后立即关闭连接。如果您正在使用任何处于原始状态的标准化协议,则应始终至少扫描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-urlencoded
。 value
是否包含HTML,XML或其他数据并不重要;服务器将为您解释它,您将能够像往常一样在PHP端的$_POST
或$_REQUEST
数组中检索数据。
或者,您可以使用相应的Content-Type
标头将您的数据作为原始HTML,XML等发送,但是您必须通过阅读特殊文件php://input
来retrieve the data manually in PHP:< / p>
<?php
echo file_get_contents("php://input");
?>
顺便说一句,如果你将它用于任何足够复杂的东西,我强烈建议你使用像HTTPClient这样的HTTP客户端库。