Java:使用TCP套接字的简单http GET请求
我在本地托管一个简单的PHP echo服务器。 我试图用Java向服务器发送消息,并使用GET请求打印响应但是收到“格式错误的HTTP请求”错误。 谁能告诉我如何正确格式化GET请求?
//客户代码:
import java.io.*; import java.net.*; public class TCPclient { public static void main(String argv[]) throws Exception { String sentence, modifiedSentence; BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in)); Socket clientSocket = new Socket("localhost", 8000); DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream()); BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); sentence = inFromUser.readLine(); outToServer.writeBytes(sentence + "\n"); outToServer.writeChars("GET /echo.php HTTP/1.1" +"\n"); modifiedSentence = inFromServer.readLine(); System.out.println("FROM SERVER: " + modifiedSentence); inFromServer.close(); outToServer.close(); inFromUser.close(); clientSocket.close(); } } //PHP Server code: <?php /* Simple php echo page */ // ini_set('display_errors', 'On'); // error_reporting(E_ALL | E_STRICT); if(isset($_GET['source'])) { if ($_GET['source'] == "raw") echo file_get_contents(basename($_SERVER['PHP_SELF'])); else echo "
" . htmlspecialchars(file_get_contents(basename($_SERVER['PHP_SELF']))) . ""; } else if (isset($_GET['message'])){ echo strtoupper( htmlspecialchars($_GET['message'])) . '\n'; } else { ?>
Error: No input message No message
Echo server called without sending parameter
http服务器理解GET,POST,PUT,DELETE等字样。 所以这是一个问题:
outToServer.writeBytes(sentence + "\n"); outToServer.writeChars("GET /echo.php HTTP/1.1" +"\n");
那里的第一个声明告诉http服务器它不理解的东西:句子。 注释掉该行和您的请求是否有效,您将得到回复。
我想你想把这个句子作为参数发布到echo服务。 您可以将它放在查询字符串中:
outToServer.writeChars("GET /echo.php?message=" + sentence + " HTTP/1.0\n\n");
我还改变了HTTP版本,并附加了一个额外的\ n,正如Steffen Ullrich的评论所指出的那样:
此外,您必须添加空行以标记标题的末尾。 行结尾必须是\ r \ n而不是\ n。 你应该更好地做HTTP / 1.0请求而不是HTTP / 1.1,因为你的代码既不能处理HTTP keep-alive也不能处理HTTP chunked编码
但是,这还不够。 您还需要编码一些字符,例如空格。 必须对get请求中的URL进行编码,如@zapl在注释中所指出的那样。
我还建议首先使用简单的telnet测试你的echo服务:
telnet localhost 8000
在那里,您可以输入您的消息,“GET /echo.php?message=something”并validation它是否有效。 一旦找到按预期工作的内容,就可以相应地更新Java代码。