2012-11-20 39 views
0

我通過從cURL發送請求來測試我的web服務器。當我把這個命令:發送空白標題的curl(測試Java Web服務器)

curl -H "_ADD_CLASS*21112*ab*https://somewebsite" 127.0.0.1:12345 

到我的服務器,我得到這個在我的Java Socket技術

GET/HTTP/1.1 
User-Agent: curl/7.24.0 (x86_64-apple-darwin12.0) libcurl/7.24.0 OpenSSL/0.9.8r zlib/1.2.5 
Host: 127.0.0.1:12345 
Accept: */* 
_ADD_CLASS*21112*ab*https://somewebsite 

這是我所期待的。

當我使用捲曲,雖然該請求發送到我的服務器,它不會發送標題爲某些原因:

curl -H "REMOVE_CLASS*21111*a" 127.0.0.1:12345 

GET/HTTP/1.1 
User-Agent: curl/7.24.0 (x86_64-apple-darwin12.0) libcurl/7.24.0 OpenSSL/0.9.8r zlib/1.2.5 
Host: 127.0.0.1:12345 
Accept: */* 
"" (as shown in java) 

任何想法,爲什麼第二次請求被顯示爲「」?這裏是一些代碼:

private static void handleRequest(Socket socket) throws IOException { 
    BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
    String socketData = null; 
    String[] commands; 
    while (br.ready()) { 
     socketData = br.readLine(); 
     //parse command 
     if (socketData.compareTo("") == 0) { 
      //Log error 
      break; 
     }else { 
      if (socketData.charAt(0) != '_') continue; 
      commands = socketData.split("\\*"); 
      if (commands[0].compareTo("_ADD_CLASS") == 0) { 
       //syntax is ADD_CLASS*CRN*TOKEN*WEB_ADDRESS 
       socket.close(); 
       addClass(commands[1], commands[2], commands[3]); 
       break; 
      }else if(commands[0].compareTo("_REMOVE_CLASS") == 0) { 
       //syntax is REMOVE_CLASS*CRN*TOKEN 
       socket.close(); 
       removeClass(commands[1], commands[2]); 
       break; 
      }else if(commands[0].compareTo("_UPDATE_TOKEN") == 0) { 
       //syntax is UPDATE_TOKEN*OLD_TOKEN*NEW_TOKEN 
       socket.close(); 
       updateDeviceToken(commands[1], commands[2]); 
       break; 
      }else { 
       //log error 
      } 
    } 
    } 
    socket.close(); 
} 

回答

1

HTTP Spec,一個頭必須有一個冒號,你不指定一個。我也將向您的cURL man page

-H,--header ...如果你沒有價值然後它的頭必須用分號結束,如-H發送自定義頁眉「 X-定製報頭;」發送「X-Custom-Header:」。

這就是說,你爲什麼試圖發明自己的方法使用HTTP頭,而不是採用REST風格?使用JAX-RS實現並讓它爲您處理基本套接字的東西不是很容易嗎?或者至少你可以使用Servlets/Filters。

+0

我正在製作一個iOS應用程序,將與我的服務器..所以你說的初始請求工作的原因是因爲它有一個冒號? – kamran619

+0

是的。 curl發送了標題,因爲您爲要發送的標題指定了鍵和值(根據需要)。我仍然建議真正考慮使用許多標準框架和設計模式之一來開發Web服務,而不是試圖手動滾動套接字,特別是在使用HTTP時。 – Charlie

+0

您的第一個請求將被任何數量的其他HTTP工具解析爲「_ADD_CLASS * 21112 * ab * https」值的「// somewebsite」的一個關鍵字 – Charlie