2016-05-11 2 views
2

Je construis une webapp avec une API REST associée dans le backend.Demande POST à ​​l'API REST sur Android ne pas obtenir les paramètres

L'API fait avec django-repos-cadre travaille, je peux faire ce qui suit de la ligne de commande:

$ http http://localhost:8000/API/api-token-auth/ username=ortho1 password=123456 

HTTP/1.0 200 OK 
Allow: POST, OPTIONS 
Content-Type: application/json 
Date: Wed, 11 May 2016 12:43:05 GMT 
Server: WSGIServer/0.2 CPython/3.5.1+ 
Vary: Cookie 
X-Frame-Options: SAMEORIGIN 

{ 
    "token": "4d6e32726e321448fc212242fc03a3fa84c80510" 
} 

Mais de mon Android App j'essaie de faire ce qui suit:

protected String doInBackground(String... urls) { 
    // Starting the request 
    URL url; 
    HttpURLConnection urlConnection = null; 
    try { 

     url = new URL("http://10.0.2.2:8000/API/api-token-auth/"); 
     urlConnection = (HttpURLConnection) url.openConnection(); 

      /* optional request header */ 
     urlConnection.setRequestProperty("Content-Type", "application/json"); 
     urlConnection.setRequestProperty("Accept", "application/json"); 

      /* for GET request */ 
     urlConnection.setRequestMethod("POST"); 

     String urlParameters = 
       "username=" + URLEncoder.encode("ortho1", "UTF-8") + 
         "&password=" + URLEncoder.encode("123456", "UTF-8"); 

     urlConnection.setRequestProperty("Content-Length", "" + 
       Integer.toString(urlParameters.getBytes().length)); 

     urlConnection.setDoOutput(true); 
     urlConnection.setDoInput(true); 

     DataOutputStream wr = new DataOutputStream (
       urlConnection.getOutputStream()); 
     wr.writeBytes (urlParameters); 
     wr.flush(); 
     wr.close(); 

     InputStream inputStream; 
     if (urlConnection.getResponseCode() == 200) { // 2xx code means success 
      inputStream = urlConnection.getInputStream(); 
     } else { 

      inputStream = urlConnection.getErrorStream(); 

     } 

     inputStream = new BufferedInputStream(inputStream); 


     String response = convertInputStreamToString(inputStream); 

     Log.i("Request", response); 

     return response; 

    } catch (Exception e) { 

     e.printStackTrace(); 
     return null; 

    } finally { 
     if(urlConnection != null) { 
      urlConnection.disconnect(); 
     } 
    } 

} 

private String convertInputStreamToString(InputStream inputStream) throws IOException { 

    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); 

    String line = ""; 
    String result = ""; 

    while((line = bufferedReader.readLine()) != null){ 
     result += line; 
    } 

     /* Close Stream */ 
    if(null!=inputStream){ 
     inputStream.close(); 
    } 

    return result; 
} 

je reçois dans la console comme réponse du serveur:

{"detail":"JSON parse error - Expecting value: line 1 column 1 (char 0)"} 

comme résultat.

Que pourrais-je faire de mal?

+0

Vous n'êtes pas envoyer "jeton". – greenapps

+0

Le jeton est dans la réponse, pas dans la demande dans le premier exemple. –

+0

Ok. '$ http http: // localhost: 8000/API/api-jeton-auth/nom d'utilisateur = mot de passe ortho1 = 123456'. Je ne sais pas django mais pourquoi serait-ce un POST? Pour moi, ça ressemble plus à un GET. – greenapps

Répondre

0

(devinez sauvage ici)

Je vois que votre serveur est en cours d'exécution dans localhost et que vous essayez d'accéder à l'aide de l'IP ... qui ne fonctionnera pas. Si vous testez essayez localement exécuter le serveur dans l'IP de diffusion: $ python manage.py runserver 0.0.0.0:8000 ou si vous avez besoin d'une adresse publique, vous pouvez utiliser un service comme ngrok pour acheminer vos requêtes à un serveur local

+0

Mes tests ont été effectués en utilisant pyon manage.py runserver 0.0.0.0:8000, l'IP que j'utilise est l'hôte de l'émulateur Android. Merci quand même! –

0
urlConnection.setRequestProperty("Content-Type", "application/json");. 

Où dans votre console commande êtes-vous en indiquant que json doit être envoyé? Django attend-il json? Django envoie json oui. Changement pour former URL encodée à la place

2

Essayez de supprimer cette ligne,

urlConnection.setRequestProperty ("Content-Type", "application/json");


Pour votre information, la meilleure bibliothèque pour faire face à toute API REST est le RATTRAPAGE http://square.github.io/retrofit/