2016-11-06 3 views
1

Ich baue eine Website mit Django und Django_rest_framework. Ich testete den Rest api mit httpie.jQuery bekommen Anfrage mit JSON Körper zu einem REST api

Aber wenn ich versuche, den gleichen Anruf mit jQuery zu tun, erhalte ich einen Fehler.

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

Der Anruf mit httpie ist die folgende

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

oder

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

und ich die richtigen Ergebnisse zu erzielen.

während mit jquery habe ich versucht,

$.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); 
    } 
}); 

Gibt es etwas falsch mit dem Anruf? Ich habe versucht mit .get anstelle von .ajax, und viele verschiedene Möglichkeiten, die JSON zu übergeben, aber ich habe noch nichts gelöst.

durch die Art und Weise dies ist die Ansicht, dass

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) 

Ist der beacause jQuery bekommt Aufruf der Lage genannt wird, ist nicht eine GET-Anforderung mit einem json Körper zu tun? Oder ich habe etwas falsch gemacht? Durch die Art und Weise bin ich mit jQuery 3.1.1

+1

Was passiert, wenn Sie die '' contentType' und processData' Optionen entfernen, und tun nur 'Daten: {last_id: 1650},' – adeneo

+0

Ein GET hat keinen Körper. ..es verwendet nur die URL. Daher gibt es auch keinen 'contentType' – charlietfl

+0

Es gibt immer noch dasselbe Ergebnis. – WisdomPill

Antwort

1

Sie die $.param Funktion verwenden sollten, wenn Sie eine GET-Anfrage bauen (und nicht die JSON.Stringify-Funktion).

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

Wenn Sie 'processData: false 'entfernen, werden die Daten standardmäßig von' $ .param() 'intern verarbeitet. – charlietfl

+0

Danke für den Kommentar! – Dekel

+0

Auch gibt es keinen 'contentType' für ein GET – charlietfl