[英]Java: Simple http GET request using TCP sockets
我在本地托管一個簡單的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 "<pre>" . htmlspecialchars(file_get_contents(basename($_SERVER['PHP_SELF']))) . "</pre>";
} else if (isset($_GET['message'])){
echo strtoupper( htmlspecialchars($_GET['message'])) . '\n';
} else {
?>
<html>
<head>
<title>Error: No input message</title>
</head>
<body>
<h1> No message</h1>
<p>Echo server called without sending parameter</p>
</body>
</html>
<?php
}
?>
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”並驗證它是否有效。 一旦找到按預期工作的內容,就可以相應地更新Java代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.