Я создаю небольшое приложение для моего телефона 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'."}
Я озадачен, любая помощь приветствуется.
Почему вы пишете два заголовка "Content-Type"? Один раз с http.setHeader, а другой через сущности. Возможно, это причина ошибки. – SJuan76
Насколько я понял, второй (в StringEntity) просто устанавливает декодирование объекта и не влияет на заголовки сообщений. Я тестировал это, не добавляя заголовок сообщения. В этом случае заголовок, который оказался в запросе, был стандартным заголовком text/plain. – Bart
Не говорю, что я уверен в этом, но я бы попробовал без сущности. Помимо этого, сниффер HTTP (например, wirehark) может помочь вам диагностировать, произошел ли сбой на клиенте или на сервере. – SJuan76