Django REST Framework學習——Android使用REST方法訪問Diango

本文更應該叫作Android如何模擬瀏覽器訪問Django服務器後臺。html

環境爲:python

Android經過HttpClient訪問服務器,從Django中獲取json數據,解析顯示在UI界面上。django

問題爲:json

1.須要登陸才能夠訪問json數據,不然會提示權限不夠api

登陸,也就是把用戶名和密碼放在請求的參數中唄,可是問題是其中會包含一個csrftoken個東西,問題就很差玩了。每次訪問登陸界面,都會由服務器生成一個csrftoken,放在瀏覽器的cookie中,登陸動做中,服務器會校驗cookie中的csrftoken,同時驗證用戶名和密碼,若是驗證經過,則將sessionid和csrftoken再次返回給瀏覽器,設置在cookie中,訪問json中的數據時,會同時檢驗sessionid和csrftoken,那問題就簡單了,能夠分紅這麼幾步在作:瀏覽器

1.第一次get請求登陸頁,獲得csrftoken服務器

2.設置用戶名,密碼,cookie中的csrftoken,(其實還包括更用戶名密碼相似的csrfmiddlewaretoken,next參數),post請求驗證,獲得sessionidcookie

3.訪問json請求路徑,其中請求頭中設置csrftoken和sessionid,能夠得到請求的數據session

好了,能夠寫代碼了:app

1.定義變量

String url = "http://ipaddress:8004/api-auth/login/?next=/";//第一次get請求url
String url2 = "http://ipaddress:8004/api-auth/login/";//第二次登陸驗證url
DefaultHttpClient httpClient;

public static String sessionID = "";
public static String scrftoken = "";

private HttpResponse mHttpResponse = null;
String htmlText;//返回的結果

Context context;

2.第一次請求,獲得csrftoken

httpClient = new DefaultHttpClient();
HttpResponse response = httpClient.execute(new HttpGet(new URI(url1)));

//這裏經過cooki得到,其實也能夠在網頁中解析csrfmiddlewaretoken得到,值是同樣的
CookieStore cookieStore = httpClient.getCookieStore();
List<Cookie> cookies = cookieStore.getCookies();

String csrftoken = null;
for (Cookie cookie : cookies) {
    if (cookie.getName().equals("csrftoken")) {
        csrftoken = cookie.getValue();
    }
}
Log.i("get csrftoken", csrftoken);

3.第二次請求獲得sessionid

HttpPost post = new HttpPost(new URI(url2));
List<NameValuePair> paramList = new ArrayList<NameValuePair>();
// 設置登錄信息
BasicNameValuePair csrfmiddlewaretoken2 = new BasicNameValuePair("csrfmiddlewaretoken", csrftoken);
//若是經過驗證,接下來的路徑,在未登陸狀況下訪問數據,提示沒有權限時
//在不一樣界面登陸這個值可能不一樣,不過關係不大,這裏忽略,設置成默認的/
BasicNameValuePair next = new BasicNameValuePair("next", "/");
BasicNameValuePair username = new BasicNameValuePair("username", "renyuzhuo");
BasicNameValuePair password = new BasicNameValuePair("password", "renyuzhuo");
//這個值沒用
BasicNameValuePair login = new BasicNameValuePair("submit", "Log in");
// 設置發送數據
paramList.add(csrfmiddlewaretoken2);
paramList.add(next);
paramList.add(username);
paramList.add(password);
paramList.add(login);

post.setEntity(new UrlEncodedFormEntity(paramList, HTTP.UTF_8));
//這句話是關鍵,在請求頭中設置csrftoken,也有設置成X-CRFSToken的,這裏不作測試了
//須要看Django
post.setHeader(new BasicHeader("csrftoken", csrftoken));

httpClient.setCookieStore(cookieStore);
mHttpResponse = httpClient.execute(post);
if (mHttpResponse.getStatusLine().getStatusCode() == 200) {
htmlText = EntityUtils.toString(mHttpResponse.getEntity(), "utf-8");
Message message = new Message();
message.what = 0;
message.obj = htmlText;
Log.i("html", htmlText);

CookieStore cookieStore2 = httpClient.getCookieStore();
List<Cookie> cookies2 = cookieStore2.getCookies();
for (Cookie cookie : cookies2) {
Log.i("cookie::", cookie.getName() + " " + cookie.getValue());
//這裏重複設置了csrftoken,沒什麼必要,寫成token=csrftoken就能夠了
        if (cookie.getName().equals("csrftoken")) {
csrftoken = cookie.getValue();
}
        //獲取sessionid
if (cookie.getName().equals("sessionid")) {
sessionID = cookie.getValue();
}
}

}

4.訪問json數據:

//設置json數據的url0
HttpGet get = new HttpGet(new URI(URLS.xxxx));
get.setHeader(new BasicHeader("csrftoken", csrftoken));
get.setHeader(new BasicHeader("sessionid", sessionID));
HttpResponse response = httpClient.execute(get);
Log.i("code::", response.getStatusLine().getStatusCode() + "");
if (response.getStatusLine().getStatusCode() == 200) {
htmlText = EntityUtils.toString(response.getEntity(), "utf-8");
Log.i("html", htmlText);
}

Message message = new Message();
message.what = 1;
mHandler.sendMessage(message);

常見的403錯誤每每就是請求頭設置出錯,也就是加紅的部分

5.獲取了json數據,接下來的操做就不在本文包含的範圍內了。

附核心源碼: http://files.cnblogs.com/files/renyuzhuo/DjangoLogin.zip

知其因此然:

csrftoken是什麼:

Cross-site request forgery,跨站請求僞造,就是其餘網站僞造請求,達到攻擊的目的,你說說我這上面的代碼方式是否是就是一個僞造請求呢,也算是一種攻擊吧,不過個人目的僅僅是由於服務器沒有給我預留接口,我就只能這樣了。若是是一個循環,一定是一個不會形成什麼嚴重後果的攻擊。

Django REST Framework是什麼:

基於Django的REST框架,是一個輕量級的庫,能夠很容易構建WEB API,被設計成模塊化,易用於自定義的體系結構,基於Django的基礎類視圖。python,Django

Django是什麼:

官網宣傳標語:Django makes it easier to build better Web apps more quickly and with less code.

官網的解釋:Django is a high-level Python Web framework that encourages rapid development and clean, pragmatic design. Built by experienced developers, it takes care of much of the hassle of Web development, so you can focus on writing your app without needing to reinvent the wheel. It’s free and open source.

 

下面的連接對你可能有幫助:

403錯誤:http://stackoverflow.com/a/17283820/440489

CSRF介紹:http://drops.wooyun.org/papers/155

Django REST Framework官網:http://www.django-rest-framework.org/

相關文章
相關標籤/搜索