2012-08-04 78 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(); 
    } 
} 
相关问题