Как переключиться с HttpClient на HttpUrlConnection
Я создаю приложение для Android и отправляю данные из приложения android на сервлет через HttpClient. Я использую метод HttpPost.
Я прочитал на сайте разработчиков Android, что у библиотеки Apache HttpClient есть некоторая ошибка в android Froyo 2.2, и после этого его хорошая практика использовать HttpUrlConnection вместо HttpPost.
Поэтому я хочу преобразовать код HttpPost в HttpUrlConnectio, но не знаю, как это сделать.
Так что, пожалуйста, помогите мне. Я отправляю свой код андроида, а также код сервлета здесь.
Код Android
private String postData(String valueIWantToSend[])
{
// Create a new HttpClient and Post Header
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost(url);
try
{
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
nameValuePairs.add(new BasicNameValuePair("param1",valueIWantToSend[0]));
nameValuePairs.add(new BasicNameValuePair("param2", valueIWantToSend[1]));
nameValuePairs.add(new BasicNameValuePair("param3", valueIWantToSend[2]));
nameValuePairs.add(new BasicNameValuePair("param4", valueIWantToSend[3]));
nameValuePairs.add(new BasicNameValuePair("param5", valueIWantToSend[4]));
nameValuePairs.add(new BasicNameValuePair("param6", valueIWantToSend[5]));
nameValuePairs.add(new BasicNameValuePair("param7", valueIWantToSend[6]));
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
/* execute */
HttpResponse response = httpclient.execute(httppost);
HttpEntity rp = response.getEntity();
//origresponseText=readContent(response);
}
catch (ClientProtocolException e)
{
// TODO Auto-generated catch block
}
catch (IOException e)
{
// TODO Auto-generated catch block
}
return null;
}
и вот мой код сервлета
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.setContentType("text/html");
ObjectOutputStream out = new ObjectOutputStream(response.getOutputStream());
Enumeration paramNames = request.getParameterNames();
String params[] = new String[7];
int i=0;
while(paramNames.hasMoreElements())
{
String paramName = (String) paramNames.nextElement();
System.out.println(paramName);
String[] paramValues = request.getParameterValues(paramName);
params[i] = paramValues[0];
System.out.println(params[i]);
i++;
}
}
Ответы
Ответ 1
Вы должны абсолютно использовать HttpUrlConnection
:
Для Gingerbread и лучше, HttpURLConnection - лучший выбор... Новые приложения должны использовать HttpURLConnection...
- Google (около 2011 г.)
Однако нет простого способа "переключиться". API полностью разные. Вам придется переписать свой сетевой код. В документации есть идеальные примеры о том, как отправлять запросы GET и POST, а также в примеры приложений SDK.
Ответ 2
Когда я прочитал уже упоминавшийся пост Google о лучших практиках, выполняющих HTTP-запросы в новых версиях Android, я подумал, что кто-то меня шутит. HttpURLConnection
- действительно кошмар для использования, по сравнению с любым другим способом связи с серверами HTTP (кроме прямой связи Socket).
Я не нашел действительно тонкую библиотеку для Android, чтобы делать тяжелую работу, поэтому я написал свой собственный. Вы можете найти его в DavidWebb, включая список альтернативных библиотек который я нашел (к сожалению) после разработки библиотеки.
Ваш код будет выглядеть примерно так:
public void testPostToUrl() throws Exception {
String[] values = new String[3];
Webb webb = Webb.create();
Response<String> response = webb
.post("http://www.example.com/abc.php")
.param("param1", values[0])
.param("param2", values[1])
.param("param3", values[2])
.asString();
assertEquals(200, response.getStatusCode());
assertNotNull(response.getBody());
assertTrue(response.getBody().contains("my expected result"));
}
public void testPostToUrlShorter() throws Exception {
String[] values = new String[3];
Webb webb = Webb.create();
String result = webb
.post("http://www.example.com/abc.php")
.param("param1", values[0])
.param("param2", values[1])
.param("param3", values[2])
.ensureSuccess()
.asString()
.getBody();
assertTrue(result.contains("my expected result"));
}
Ответ 3
Вам не нужно переключаться, вы можете продолжить использование библиотеки apache, как описано в этом. На самом деле нет недостатков для продолжения использования библиотеки apache - это только маркетинг google.