Android使用POST数据调用Django服务器

时间:2015-09-30 05:57:33

标签: android django

有人可能已经问过我的问题,但我找不到任何建议。

我编写的Android应用需要使用Django访问我的HttpsURLConnection服务器,然后Django服务器会将JSON数组返回给Android。

Django中的视图函数将从request.POST接收参数并生成JSON数组,然后使用HTTPResponse Django方法返回。它不需要任何模板和表单。

当我从Android调用Django视图函数时,它会返回403错误。我知道这是因为POST数据不包含" csrf_token"。

我的问题是:如何获得" csrf_token"并在将其发送到Django之前将其放入我的POST数据中?我尝试通过" @ csrf_exempt"禁用CSRF检查。它可以将正确的结果返回给Android应用,但我不会禁用CSRF检查。

谢谢, 威尔逊

1 个答案:

答案 0 :(得分:0)

您必须发送Cookie并且还必须使用csrftoken发送标题“X-CSRFToken”。

这就是我所做的(可能不是最好的方式):

  1. 通过get请求获取csrf令牌。但首先尝试通过使用开发人员工具在浏览器上执行相同的请求来查看是否获得了csrftoken cookie。如果没有,你应该使用ensure_csrf_cookie decorator

    from django.views.decorators.csrf import ensure_csrf_cookie
    @ensure_csrf_cookie
    def your_view(request):
        pass
    
  2. 现在使用相同的HttpUrlConnection对象执行以下操作:

    String cookieString="";
    String csrftoken="";
    
    // The below code can be shortened using for-each loop
    List<HttpCookie> cookies=cookieManager.getCookieStore().getCookies();
    Iterator<HttpCookie> cookieIterator=cookies.iterator();
    while(cookieIterator.hasNext()){
        HttpCookie cookie=cookieIterator.next();
        cookieString+=cookie.getName()+"="+cookie.getValue()+";";
        if(cookie.getName().equals("csrftoken")){
            csrftoken=cookie.getValue();
        }
    }
    
  3. 将以下内容添加到您的帖子请求中:

    urlConnection.setRequestProperty("X-CSRFToken", csrftoken);
    urlConnection.setRequestProperty("Cookie", cookieString);