2012-04-21 4 views
3

Я создаю небольшое приложение для моего телефона Android для пересылки текстовых сообщений на веб-сервер, используя очень простой интерфейс REST.Java HttpClient меняет контент-тип?

Я использую android 4.0.3 SDK. Я разработал webservice в python, используя пакет Django и Django restframework. Установка полностью из коробки. Существует, в основном, одна конечная точка, которая получает POST объекта JSON, содержащего информацию о сообщении (отправитель, тело, дата). Я тестировал услугу с помощью Curl с помощью следующей команды:

curl -X POST -H 'Content-Type: application/json' --data '{"sender":"+xxxxxxxx", "body": "test", "send_date":"2011-03-20 16:32:02"}' http://[...]/messages.json

Это все работает отлично, и я получаю ожидаемый ответ:

{"body": "test", "send_date": "2011-03-20T16:32:02", "id": 25, "sender": "+xxxxxxxxxx"}

Теперь я создал приложение для Android. Это простой BroadcastReceiver дочерний класс, который включает в себя частный класс AsyncTask:

private class httpPost extends AsyncTask<String, Void, JSONObject> { 
    protected JSONObject doInBackground(String... args) { 
     // Create a new HttpClient and Post Header 
     HttpClient httpclient = new DefaultHttpClient(); 
     HttpParams myParams = new BasicHttpParams(); 
     HttpConnectionParams.setConnectionTimeout(myParams, 10000); 
     HttpConnectionParams.setSoTimeout(myParams, 10000); 

     String url = args[0]; 
     String json=args[1];    
     JSONObject JSONResponse = null; 
     InputStream contentStream = null; 
     String resultString = ""; 

     try { 
      HttpPost httppost = new HttpPost(url); 
      httppost.setHeader("Content-Type", "application/json"); 
      httppost.setHeader("Accept", "application/json"); 

      StringEntity se = new StringEntity(json); 
      se.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE, "application/json")); 
      httppost.setEntity(se); 

      for (int i=0;i<httppost.getAllHeaders().length;i++) { 
       Log.v("set header", httppost.getAllHeaders()[i].getValue()); 
      } 

      HttpResponse response = httpclient.execute(httppost); 

      // Do some checks to make sure that the request was processed properly 
      Header[] headers = response.getAllHeaders(); 
      HttpEntity entity = response.getEntity(); 
      contentStream = entity.getContent(); 

     } catch (ClientProtocolException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     //convert response to string 
     try{ 
      BufferedReader reader = new BufferedReader(new InputStreamReader(contentStream,"iso-8859-1"),8); 
      StringBuilder sb = new StringBuilder(); 
      String line; 
      while ((line = reader.readLine()) != null) { 
       sb.append(line + "\n"); 
      } 
      contentStream.close(); 
      resultString = sb.toString(); 
     }catch(Exception e){ 
      e.printStackTrace(); 
     } 

     Log.v("log", resultString); 
     return new JSONObject(); 
    } 


} 

Как вы видите, я только начинаю знакомиться с Java и андроид SDK поэтому, пожалуйста, медведь со мной. Эта настройка действительно отлично работала в другом приложении, которое я создаю для отправки строк JSON в веб-сервис Neo4J.

Проблема в том, что когда я отправляю сообщение через Android в свой веб-сервис, в какой-то момент тип контента изменяется с «application/json» на «application/json, application/json». Запись журнала в цикле заголовков еще выдает правильные значения для каждого заголовка, однако, вебсервис возвращает сообщение об ошибке:

{"error": "Unsupported media type in request 'application/json, application/json'."}

Я озадачен, любая помощь приветствуется.

+0

Почему вы пишете два заголовка "Content-Type"? Один раз с http.setHeader, а другой через сущности. Возможно, это причина ошибки. – SJuan76

+0

Насколько я понял, второй (в StringEntity) просто устанавливает декодирование объекта и не влияет на заголовки сообщений. Я тестировал это, не добавляя заголовок сообщения. В этом случае заголовок, который оказался в запросе, был стандартным заголовком text/plain. – Bart

+1

Не говорю, что я уверен в этом, но я бы попробовал без сущности. Помимо этого, сниффер HTTP (например, wirehark) может помочь вам диагностировать, произошел ли сбой на клиенте или на сервере. – SJuan76

ответ

6

Изменить это:

StringEntity se = new StringEntity(json); 
se.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE, "application/json")); 
httppost.setEntity(se); 

К этому только:

httppost.setEntity(new StringEntity(json.toString(), HTTP.UTF_8)); 
+0

Спасибо, товарищ !! Это все, что мне нужно. @ SJuan76 вы были правы, а также, приветствует ребята, очень полезно! – Bart

+3

Должно быть 'se.setContentType (новый BasicHeader (HTTP.CONTENT_TYPE," application/json "));' – Danpe

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