2012-07-25 58 views
1

我有一個簡單的Java應用程序,它對Web服務請求作出反應。Django中的Web服務

當用戶按下按鈕時,會向Java應用程序發送消息。

如果消息是「ping」,則應用程序以「pong」響應,否則 - 「未知消息」。

代碼的Java應用程序:

@Path("/ping-pong") 
public class PingPongService { 

    @POST 
    @Produces("text/plain") 
    public String test(@FormParam("message") final String aMessage) { 
     System.out.println("message from client: " + aMessage); 
     if ("ping".equalsIgnoreCase(aMessage)) { 
      System.out.println("ping.equalsIgnoreCase(aMessage)"); 
      return "pong"; 
     } else { 
      System.out.println("Unknown message"); 
      return "unknown message " + aMessage; 
     } 
    } 

} 

在WAR文件裏,我有以下的HTML代碼,其中工程(當我按下一個按鈕,我從Java應用程序的響應,它是在消息框中顯示):

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
     "http://www.w3.org/TR/html4/loose.dtd"> 
<html> 
<head> 
    <title>JavaScript Ping-Pong Client</title> 
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script> 
    <script type="text/javascript"> 

     //This function send post request to the server using jQuery 
     function testWithJQuery(message){ 
      $.post('http://localhost:8345/rest/ping-pong', { message: message }, function(data) { 
       alert(data); 
      }); 
     } 

     //This function send post request to the server using a low-level XmlHttpRequest instead of the jQuery 
     //(no dependencies on external libraries) 
     function test(message){ 
      var http = new XMLHttpRequest(); 
      var url = "http://localhost:8345/rest/ping-pong"; 
      var params = "message=" + message; 
      http.open("POST", url, true); 
      http.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 
      http.setRequestHeader("Content-length", params.length); 
      http.setRequestHeader("Connection", "close"); 
      http.onreadystatechange = function() { 
       if(http.readyState == 4 && http.status == 200) { 
        alert(http.responseText); 
       } 
      }; 
      http.send(params); 
     } 
    </script> 
</head> 
<body> 
    <button onclick="test('ping')">Test</button> 
    <button onclick="testWithJQuery('ping')">Test using jQuery</button> 
</body> 
</html> 

我想做同樣的事情(用戶按下一個按鈕,一個消息被髮送到Java應用程序和響應在警告消息窗口中顯示)在Django應用程序。

Django的生成下面的HTML代碼:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> 
<html lang="en"> 
<head> 
    <title></title> 

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script> 
<script type="text/javascript"> 
    //This function send post request to the server using jQuery 
    function testWithJQuery(message){ 
     $.post('http://localhost:8345/rest/ping-pong', { message: message }, function(data) { 
      alert(data); 
     }); 
    } 

    //This function send post request to the server using a low-level XmlHttpRequest instead of the jQuery 
    //(no dependencies on external libraries) 
    function test(message){ 
     var http = new XMLHttpRequest(); 
     var url = "http://localhost:8345/rest/ping-pong"; 
     var params = "message=" + message; 
     http.open("POST", url, true); 
     http.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 
     http.setRequestHeader("Content-length", params.length); 
     http.setRequestHeader("Connection", "close"); 
     http.onreadystatechange = function() { 
      if(http.readyState == 4 && http.status == 200) { 
       alert(http.responseText); 
      } 
     }; 
     http.send(params); 
    } 
</script> 


</head> 
<body> 
<button onclick="test('ping')">Test</button> 
</body> 
</html> 

在按下在Django生成的代碼的「測試」按鈕,Java應用程序接收到該消息(我看到這在控制檯輸出),但反應的Java應用程序未在Django網站中顯示,即使HTML代碼與WAR文件中的代碼完全相同。

我該如何解決這個問題,即確保在Django中顯示Java應用程序的響應?

UPD:這是在Chrome中的「網絡」窗格中的詳細的錯誤描述:

enter image description here

+1

你試過'<按鈕的onclick = 「testWithJQuery( '平')」>測試 '? – 2012-07-26 00:05:11

+0

如果輸出的HTML是相同的(不是),那麼用於生成它的語言是完全不相關的。 – Hamish 2012-07-26 01:45:14

+0

@PauloScardine:是的,我試過了,結果是一樣的。 – 2012-07-26 03:37:52

回答

1

這不是一個直接的答案,而是一些提示,以幫助您診斷問題;我在這裏發佈,因爲它太大而無法發表評論。

  1. 打開Chrome調試器(SHIF + CTRL + )或Firefox螢火蟲和使網絡選項卡激活。
  2. 通過檢查兩個版本發的帖子,比較標題和正文

如果有不同的行爲,應該有兩個職位之間的一些差異。

[更新]

我發現錯誤 - 見截圖中的問題。錯誤是「XMLHttpRequest無法加載localhost:8345/rest/ping-pong。原型localhost:8000不被Access-Control-Allow-Origin允許。」。

錯誤是由於瀏覽器中的安全限制(same origin policy)。有一些workarrounds(來源:Wikipedia):

爲了使開發人員能夠,以受控的方式,繞過同源策略,一些「黑客」如使用片段標識符或window.name屬性的已被用於在位於不同域中的文檔之間傳遞數據。使用HTML5標準,一種方法正式化了:postMessage接口,它只在最近的瀏覽器上可用。 JSONP和跨源資源共享也可用於啓用對其他域的類似Ajax的調用。 2 easyXDM也可以用於輕鬆解決由相同原產地政策制定的限制。它是一個輕量級,易於使用且自包含的JavaScript庫,可以讓開發人員輕鬆跨域邊界交流和公開JavaScript API。

我用subdomain hack成功,看到這樣的回答:

+0

我發現了錯誤 - 請參閱問題中的屏幕截圖。錯誤是「XMLHttpRequest無法加載http:// localhost:8345/rest/ping-pong。原始http:// localhost:8000不被Access-Control-Allow-Origin允許。」。 – 2012-07-26 17:12:39

+0

@DmitriPisarenko:回答更新,指出原因和解決方案。 – 2012-07-27 01:45:14

+0

謝謝。在http://www.flickr.com/photos/iluvrhinestones/5889370258/有一個決策樹來選擇這項任務的技術。其中一個選項是網絡套接字。它們適合我的需求嗎?請注意,我的應用程序永遠不會與服務器交換敏感數據。 – 2012-07-27 12:32:19