2012-08-04 85 views
0

我有一段Java代碼嘗試將POST數據發送到Django應用程序。但是,這個視圖根本就不會被調用。如果我將粘貼的Java代碼粘貼到瀏覽器中,則會調用Django視圖。我不知道我錯過了什麼,但Java寫入時必須有錯。發送JSON POST到Django應用程序

這是Java功能做寫:

public void executeWrite(String requestUrl, JsonObject jsonObject) 
{ 
    DataInputStream input = null; 
    try 
    { 
     URL     url; 
     HttpURLConnection urlConn; 
     DataOutputStream printout; 

     System.out.println(requestUrl); 
     // URL of CGI-Bin script. 
     url = new URL (requestUrl); 
     // URL connection channel. 
     urlConn = (HttpURLConnection)url.openConnection(); 
     // Let the run-time system (RTS) know that we want input. 
     urlConn.setDoInput (true); 
     // Let the RTS know that we want to do output. 
     urlConn.setDoOutput (true); 
     // No caching, we want the real thing. 
     urlConn.setUseCaches (false); 
     // Specify the content type. 
     urlConn.setRequestMethod("POST"); 
     urlConn.setRequestProperty("content-type","application/json; charset=utf-8"); 

     OutputStreamWriter wr = new OutputStreamWriter(urlConn.getOutputStream()); 
     wr.write(jsonObject.toString()); 
     wr.flush(); 
     wr.close(); 
    } 
    catch(Exception ex) 
    { 
     ex.printStackTrace(); 
    } 
} 

現在requestURL傳遞給函數直接對應於一個Django的視圖。該requestURL是:

http://127.0.0.1:8000/events/rest/33456/create 

這是Django的Urlconfig:

(r'^events/rest/(?P<key>\d+)/create', 'events.views.restCreateEvent'), 

最後這是一個永遠不會被Java代碼調用

@csrf_exempt 
def restCreateEvent(request, key): 
    #doesn't really matter what is in here it never runs 

這樣的觀點,我在做什麼Django服務器永遠不會收到POST請求,這是錯誤的嗎?我花了大約2個小時試圖找出它,並找不到Java代碼的任何問題。顯然有些事情是錯誤的。

+0

您應該測試Java應用程序發送的內容並在此處顯示以確定問題是出現在Java部分還是Django上。 – Lycha 2012-08-04 20:55:27

+0

你會如何推薦測試它?我試圖讓Wireshark向我展示流量,但我似乎無法做到這一點。我在OS X上。它顯示了大量的其他HTTP流量,但即使我的工作REST調用由於某種原因也未被記錄。 – Jon 2012-08-04 20:57:38

+0

你看到請求在開發服務器上進來嗎?檢查你沒有在視圖中同一個函數的多重定義。 – Rohan 2012-08-04 21:02:22

回答

1

請確保您的視圖是csrf exempt,因爲您沒有從Java請求發送適當的CSRF令牌。

+0

我做了這個改變,但是錯誤仍然存​​在。這當然是朝着正確方向邁出的一步。 – Jon 2012-08-04 20:49:57

0

我認爲crsf的東西實際上是問題所在。一旦我添加了,我稍微改變了Java代碼,並且它工作。我仍然不確定微妙的Java錯誤是什麼,這裏是工作的Java代碼。

public void executeWrite(String requestUrl, JsonObject jsonObject) 
{ 
    InputStreamReader input = null; 
    try 
    { 
     URL     url; 
     HttpURLConnection urlConn; 
     DataOutputStream printout; 

     System.out.println(requestUrl); 
     // URL of CGI-Bin script. 
     url = new URL (requestUrl); 
     // URL connection channel. 
     urlConn = (HttpURLConnection)url.openConnection(); 
     // Let the run-time system (RTS) know that we want input. 
     urlConn.setDoInput (true); 
     // Let the RTS know that we want to do output. 
     urlConn.setDoOutput (true); 
     // No caching, we want the real thing. 
     urlConn.setUseCaches (false); 
     // Specify the content type. 
     urlConn.setRequestMethod("POST"); 
     urlConn.setRequestProperty("content-type","application/json; charset=utf-8"); 

     OutputStreamWriter wr = new OutputStreamWriter(urlConn.getOutputStream()); 
     wr.write(jsonObject.toString()); 
     wr.flush(); 
     wr.close(); 

     input = new InputStreamReader (urlConn.getInputStream()); 
     String response = UserInterface.read(new BufferedReader(input)); 

     if(response.length() > 0) 
     { 
      System.out.println("Response:" + response); 
     } 

     input.close(); 
    } 
    catch(IOException ex) 
    { 
     ex.printStackTrace(); 
    } 
} 
相關問題