2016-11-06 72 views
1

我正在用django和django_rest_framework構建一個網站。 我用httpie測試了其餘的api。jQuery獲取json主體請求到REST api

但是,當我嘗試使用jQuery執行相同的調用時出現錯誤。

jquery.min.js:4 GET http://localhost:8000/api/recentposts/?{%22last_id%22:1650} 500 (Internal Server Error) 

與httpie的調用如下

http get localhost:8000/api/recentposts/ last_id=1650 

http get localhost:8000/api/recentposts/ < recent.json 
---------------------------- 
content of recent.json 
{ 
    "last_id": 1650 
} 

,我得到正確的結果。

而使用jQuery我試圖

$.ajax({ 
    type: 'GET', 
    url: 'http://localhost:8000/api/recentposts/', 
    contentType: 'application/json', 
    dataType: 'json', 
    processData: false, 
    data: JSON.stringify({ last_id : 1650 }), 
    success: function(resp){ 
     console.log(resp); 
    } 
}); 

有什麼錯的電話嗎? 我試過用.get代替.ajax,還有很多不同的方法來傳遞json,但我還沒有解決任何問題。

通過這種方式是被稱爲

class RecentPostViewSet(viewsets.ReadOnlyModelViewSet): 
    ''' 
    ViewSet that displays recent posts after it post id 

    It needs a JSON file like the following 
    { 
     "last_id" : int 
    } 
    ''' 
    queryset = Post.objects.all() 
    serializer_class = PostSerializer 

    def list(self, request): 
     recent_feed = Post.objects.filter(hidden=False).order_by('-pub_date').filter(pk__gt=request.data['last_id']) 

     log.warning("incoming request") 
     log.warning(dir(request)) 
     log.warning(request.data) 
     log.warning(request.query_params) 

     serializer = self.get_serializer(recent_feed, many=True) 
     return Response(serializer.data) 

認爲這是東陽的jQuery得到調用不能夠做一個json體的GET請求?或者我出錯了? 順便說一下,我使用jQuery 3.1.1

+1

如果去掉'contentType'和'processData'選項,只是做會發生什麼'數據:{last_id:1650}' – adeneo

+0

一個GET沒有主體。 ..它只使用網址。因此,沒有'contentType' – charlietfl

+0

仍然有相同的結果。 – WisdomPill

回答

1

當你建立一個GET請求(而不是JSON.Stringify函數)時,你應該使用$.param函數。

data: $.param({'last_id' : 1650 }), 

$.ajax({ 
 
    type: 'GET', 
 
    url: '/', 
 
    dataType: 'json', 
 
    processData: false, 
 
    data: $.param({'last_id' : 1650 }), 
 
    success: function(resp){ 
 
     console.log(resp); 
 
    } 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

+1

如果你刪除了'processData:false',那麼數據將在默認情況下由內部的$ .param()處理。 – charlietfl

+0

感謝您的評論! – Dekel

+0

還有一個GET沒有'contentType' – charlietfl