Request 類對應 HTTP 請求。創(chuàng)建這個類的實例,并傳給它從 Socket 獲得的 InputStream 對象,從而捕獲與客戶端的通信。呼叫 InputStream 對象的 read 方法中的一個就可以得到 HTTP 請求的原始數據。 Request 類有二個 public 方法 parse 與 getUri。parse 方法解析 HTTP 請求的原始數據。它做的事情不多--唯一它使之有效的信息是 HTTP 請求的 URI ,這個通過呼叫私有方法 parseUri 來獲得。parseUri 方法把 URI 作為一個變量。調用 getUri 方法可以得到 HTTP 請求的 URI 。 要明白 parse 與 parseUri 的工作原理,你需要知道 HTTP 請求的結構,由 RFC2616 定義。 一個 HTTP 請求包括三個部分: Request line Headers Message body 現在,我們只需要關注 HTTP 請求的第一部分--請求行。請求行以方法記號開始,接著是請求的 URI 與協議版本,以回車換行符結束。請求行的元素之間以空格分開。例如,一個用 GET 方法的 index.Html 文件的請求行如下: GET /index.html HTTP/1.1 parse 方法從 socket 的 InputStream 傳遞給 Request 對象中讀取字節(jié)流,把這個字節(jié)數組存在緩沖里。然后,它把 buffer 字節(jié)數組里的字節(jié)放入叫做 request 的 StringBuffer 對象中,再把 StringBuffer 替換成 String 傳遞給 parseUri 方法。 parse 方法的代碼如列表 1.2 Listing 1.2. The Request class' parse method
public void parse() { // Read a set of characters from the socket StringBuffer request = new StringBuffer(2048); int i; byte[] buffer = new byte[2048];
try { i = input.read(buffer); } catch (IOException e) { e.PRintStackTrace(); i = -1; }
for (int j=0; j<i; j++) { request.append((char) buffer[j]); }
System.out.print(request.toString()); uri = parseUri(request.toString()); }
parseUri 方法查找請求行的第一個與第二個空格,從而從請求行獲得了 URI 。列表 1.3 展示了 parseUri 方法的代碼。 Listing 1.3. The Request class' parseUri method