2015-12-13 9 views
16

Nel django documentation, dice:Acessing POST dati dei campi senza forma (REST API) Django

HttpRequest.POST

Un oggetto simil dizionario contenente tutti trovati parametri POST HTTP, a condizione che la richiesta contiene i dati del modulo. Vedi la documentazione di QueryDict qui sotto. Se è necessario accedere ai dati non elaborati o non formattati pubblicati nella richiesta, accedervi tramite l'attributo HttpRequest.body.

Tuttavia, il server non risponde a un browser (come l'utilizzo di framework JS o un modulo) ma piuttosto un API REST inviato da un'applicazione Anroid/iOS.

Se il client invia i campi direttamente in una richiesta POST, come posso leggere i dati? Ad esempio, questo (Java + Unirest):

Unirest.post("/path/to/server") 
     .field("field1", "value2") 
     .field("field2", "value2"); 

EDIT: Posso semplicemente leggere i dati utilizzando response.POST["field1"], o dovrò fare qualcosa con request.body?

MODIFICA 2: Quindi posso semplicemente utilizzare request.body come un oggetto simile a un dizionario simile a request.POST?

+0

avete tutti i dati in request.body – utkbansal

risposta

8

Per quanto ne so, il metodo sul campo di Unirest utilizza solo i normali dati application/x-www-form-urlencoded come un modulo HTML. Quindi dovresti essere in grado di usare semplicemente response.POST["field1"] come suggerito.

4

Dal docs:

request.data restituisce il contenuto analizzata del corpo della richiesta. Questo è simile allo standard request.POST e request.FILES attributi eccetto che:

  • Esso include tutti i contenuti analizzati, tra cui gli ingressi di file e non-file.
  • Supporta l'analisi del contenuto di metodi HTTP diversi POST, il che significa che è possibile accedere al contenuto del PUT e PATCH
    richieste.
  • Supporta l'analisi flessibile delle richieste del framework REST, anziché solo il supporto dei dati del modulo. Ad esempio, è possibile gestire i dati in entrata JSON nello stesso modo in cui si gestiscono i dati del modulo in entrata.

Posso semplicemente leggere i dati utilizzando response.POST["field1"], o dovrò hanno a che fare qualcosa con request.body?

Quindi posso semplicemente utilizzare request.body come un oggetto simile al dizionario simile a request.POST?

Un esempio - Da un metodo create (viewsets):

user = dict(
       full_name=request.DATA['full_name'], 
       password=request.DATA['password'], 
       email=request.DATA['email'], 
       personal_number=request.DATA['personal_number'], 
       user_type=request.DATA['user_type'], 
       profile_id=request.DATA['profile_id'], 
       account_id=request.DATA['account_id'] 
      ) 

Modifica 1: Nella versione 3 (ultima) - request.DATA è stato sostituito con request.data:

user = dict(
        full_name=request.data['full_name'], 
        password=request.data['password'], 
        email=request.data['email'], 
        personal_number=request.data['personal_number'], 
        user_type=request.data['user_type'], 
        profile_id=request.data['profile_id'], 
        account_id=request.data['account_id'] 
       ) 
+2

'request.DATA' è deprecato nelle nuove versioni e sostituito da' request.data' – DhiaTN

+0

Grazie per averlo indicato, non ho toccato l'ultima versione 3 - utilizzando 2.3.13 –

5

Se l'api con cui si sta interagendo è una vista Djip basata su classi sipmle, si accede ai dati che ruvida request.body qualcosa di simile:

class MyView(View): 
    def post(self, request): 
     field1 = request.body.get('field1') 
     field2 = request.body.get('field2') 
     ... # processing here 

Nel caso in cui si utilizza Django api quadro di riposo, si accede ai dati tramite request.data:

field1 = request.data.get('field1') 
field2 = request.data.get('field2') 

NB: Se trovate request.DATA utilizzato da qualche parte in internet che è corretto anche, ma è valido solo per la vecchia versione di DRF, ed è deprecato a favore di request.data nelle versioni più recenti.