Java 向Django应用程序发送JSON帖子

Java 向Django应用程序发送JSON帖子,java,django,json,rest,Java,Django,Json,Rest,我有一些Java代码试图将POST数据发送到t Django应用程序。然而,该视图从未被调用。如果我将java代码命中的同一URL粘贴到浏览器中,就会调用Django视图。我不知道我遗漏了什么,但Java编写肯定有问题 这是执行写操作的Java函数: public void executeWrite(String requestUrl, JsonObject jsonObject) { DataInputStream input = null; try {

我有一些Java代码试图将POST数据发送到t Django应用程序。然而,该视图从未被调用。如果我将java代码命中的同一URL粘贴到浏览器中,就会调用Django视图。我不知道我遗漏了什么,但Java编写肯定有问题

这是执行写操作的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。请求URL为:

http://127.0.0.1:8000/events/rest/33456/create
这是Django Urlconfig:

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

那么,我做错了什么,Django服务器从未收到POST请求?我花了大约2个小时试图弄明白,但我找不到Java代码的任何问题。显然有些地方出了问题。

请确保您的观点是正确的,因为您没有从Java请求发送适当的CSRF令牌。

我认为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();
    }
}

我记得当使用“POST”类型时,URL需要更改为“”。

我做了更改,但错误仍然存在。当然,这是朝着正确方向迈出的一步。您应该测试Java应用程序到底发送了什么,并在此处显示,以了解问题是在Java部件还是Django上。您建议如何测试它?我想让Wireshark告诉我流量,但我似乎无法做到这一点。我在OSX上。它向我显示了大量的其他HTTP流量,但由于某些原因,即使是我的working REST调用也没有被它记录下来。您看到开发服务器上有请求了吗?检查是否在视图中没有相同函数的多个定义。@Jon您可以使用netcat侦听端口8000并停止django服务器。数据包被打印到控制台。Linux中的语法是nc-l-p8000
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();
    }
}