2016-05-11 2 views
2

Я создаю webapp с ассоциированным REST API в бэкэнд.Запрос POST для API REST на Android, не получающий параметры

API-интерфейс сделан с Джанго-остальное-основа работает, я могу сделать следующее из командной строки:

$ 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" 
} 

Но из моего Android App я пытаюсь сделать следующее:

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; 
} 

я получаю в консоли в качестве ответа от сервера:

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

как результат.

Что я могу делать неправильно?

+0

Вы не посылаете "маркер". – greenapps

+0

Токен в ответе, а не в запросе в первом примере. –

+0

Хорошо. '$ http http: // localhost: 8000/API/api-token-auth/username = ortho1 password = 123456'. Я не знаю django, но почему это будет POST? Для меня это больше похоже на GET. – greenapps

ответ

0

(Wild догадывается здесь)

Я вижу, что ваш сервер работает в локальном и вы пытаетесь получить к нему доступ с помощью IP ... это не будет работать. Если вы проверяете на место попробовать запустить сервер в широковещательных IP: $ python manage.py runserver 0.0.0.0:8000 или если вам нужен публичный адрес, который вы можете использовать некоторые услуги, как ngrok направлять свои запросы на локальный сервер

+0

Мои тесты были сделаны с использованием pyon manage.py runningerver 0.0.0.0:8000, IP-адрес, который я использую, является хостом от Android-эмулятора. Спасибо в любом случае! –

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

Где в вашем консоль вы заявляете, что json нужно отправить? Является ли django ожиданием json? Django отправить json да. Изменить, чтобы сформировать URL закодирован вместо

2

Попробуйте удалить эту строку,

urlConnection.setRequestProperty ("Content-Type", "применение/JSON");


Для вашей информации, лучшая библиотека для работы с любым REST API является RETROFIT http://square.github.io/retrofit/

Смежные вопросы