Java 向Django应用程序发送JSON帖子
我有一些Java代码试图将POST数据发送到t Django应用程序。然而,该视图从未被调用。如果我将java代码命中的同一URL粘贴到浏览器中,就会调用Django视图。我不知道我遗漏了什么,但Java编写肯定有问题 这是执行写操作的Java函数: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 {
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();
}
}