2013-06-01 115 views
3

我在使用HTTPService時出錯。我寫了一個示例代碼和它看起來像這樣:Telnet到WebService - HTTP/1.1 400錯誤請求

import java.net.InetSocketAddress; 

import com.kivar.lumina.services.handlers.LuminaSearchService; 
import com.sun.net.httpserver.HttpServer; 

public class LuminaWebService { 

    public static void main(String[] args) throws Exception { 
     HttpServer server = HttpServer.create(new InetSocketAddress(8000), 0); 
     server.createContext("/luminaSearchService ", new LuminaSearchService()); 
     server.start(); 
    } 

} 

我的處理程序類

import java.io.IOException; 
import java.io.OutputStream; 

import com.kivar.lumina.services.interfaces.SearchService; 
import com.sun.net.httpserver.HttpExchange; 
import com.sun.net.httpserver.HttpHandler; 

public class LuminaSearchService extends Thread implements SearchService, HttpHandler { 

    @Override 
    public void handle(HttpExchange arg0) throws IOException { 
     setDaemon(true); 
     String response = "This is the response"; 
     arg0.sendResponseHeaders(200, response.length()); 
     OutputStream os = arg0.getResponseBody(); 
     os.write(response.getBytes()); 
     os.close(); 
    } 

} 

當我嘗試使用命令提示符,這句法做遠程登錄,

telnet 127.0.0.1 8000

我收到一個錯誤,說

HTTP/1.1 400 Bad Request 
Connection to the host lost. 

請讓我知道我在這裏提交的錯誤。萬分感謝。

+1

您是否在您的遠程登錄中發送任何HTTP標頭?或者甚至沒有等待輸入而立即失敗?如果第二個,它是一個bug ... – fge

+0

其實我不知道最新的測試這個簡單的Web服務的正確方法是什麼。當我做'telnet 127.0.0.1 8000'時,我得到一個空白屏幕,但是當我嘗試鍵入'GET/luminaSearchService'(它甚至在CMD提示符下不可見)時,我得到那個錯誤 – LPD

+2

您需要指定HTTP版本,即'GET/luminaSearchService HTTP/1.0'。然後打回兩次,即留空行表示請求結束。 – Rup

回答

5

您的網絡服務器似乎不再支持HTTP 1.0。對於HTTP 1.1,你必須指定版本號和主機名:

GET /luminaSearchService HTTP/1.1 
Host: 127.0.0.1 

在Windows命令窗口,這是正常的你不知道你正在輸入的內容。

因爲這是一個簡單的GET請求,所以如果您將Web瀏覽器指向此URL,會不會更容易?

+0

是的。我已經這樣做了,但想測試這個telnet並理解相同。非常感謝 – LPD

+0

我有一個小小的疑問,一旦使用telnet連接,我們可以發送多個GET請求嗎? – LPD

+0

在發送前一個請求的響應之後,HTTP 1.1應該等待另一個請求。但它通常有一個很短的超時時間(通常在新實現中爲5秒),並且會迅速關閉連接。對於HTTP 1.0,您可以通過指定「Connection:keep-alive」來實現它。但是,大多數情況下,它會關閉連接,因爲HTTP 1.0錯過了分塊傳輸編碼。 – Codo

1

您的webservice可能會期待一些請求或頭部參數,因此引發此錯誤。你能否提供web服務的合同?

+0

很抱歉,但是這裏的合同意味着什麼?我現在也在我的問題中添加了我的處理程序類,所以請看看。感謝您的時間 – LPD

+0

合同我的意思是,您的web服務的規範。什麼是URL,請求/頭部參數是必需/可選的,等等。一旦我們知道什麼web服務需要正確處理請求,那麼只有我們可以理解爲什麼它會拋出400BAD請求。 –