Сегодня я хочу портировать апплет автоматической регистрации с использованием HttpClient на Android. К счастью, Android SDK поставляется с пакетом HttpClient. Просматривая документацию Android, я обнаружил, что официальный поставщик также предоставляет AndroidHttpClient, реализующий интерфейс HttpClient. Я искал в Интернете и не нашел статей об AndroidHttpClient. Конечно, вы можете продолжать использовать DefaultHttpClient, но, естественно, лучше использовать AndroidHttpClient, настроенный для Android.
Ниже приведены 2 HttpServlet для тестирования :
Скопируйте код кода следующим образом:
публичный класс LogIn расширяет HttpServlet {
/**
* Обрабатывает запросы как для HTTP
* <code>GET</code> и
* Методы <code>POST</code>.
*
* @param запрос сервлета запроса
* @param ответ ответа сервлета
* @throws ServletException, если возникает ошибка, связанная с сервлетом
* @throws IOException при возникновении ошибки ввода-вывода
*/
protected voidprocessRequest (запрос HttpServletRequest, ответ HttpServletResponse)
выдает ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
request.setCharacterEncoding("utf-8");
PrintWriter out = response.getWriter();
HttpSession session=request.getSession();
Строка info=request.getParameter("информация");
session.setAttribute("информация", информация);
пытаться {
/* TODO выведите сюда свою страницу. Вы можете использовать следующий пример кода */.
out.println("ОК");
} окончательно {
выход.закрыть();
}
}
// <editor-fold defaultstate="collapsed" desc="Методы HttpServlet. Нажмите на знак + слева, чтобы отредактировать код.">
/**
* Обрабатывает HTTP
* Метод <code>GET</code>.
*
* @param запрос сервлета запроса
* @param ответ ответа сервлета
* @throws ServletException, если возникает ошибка, связанная с сервлетом
* @throws IOException при возникновении ошибки ввода-вывода
*/
@Override
protected void doGet (запрос HttpServletRequest, ответ HttpServletResponse)
выдает ServletException, IOException {
ProcessRequest (запрос, ответ);
}
/**
* Обрабатывает HTTP
* Метод <code>POST</code>.
*
* @param запрос сервлета запроса
* @param ответ ответа сервлета
* @throws ServletException, если возникает ошибка, связанная с сервлетом
* @throws IOException при возникновении ошибки ввода-вывода
*/
@Override
protected void doPost (запрос HttpServletRequest, ответ HttpServletResponse)
выдает ServletException, IOException {
ProcessRequest (запрос, ответ);
}
/**
* Возвращает краткое описание сервлета.
*
* @return строку, содержащую описание сервлета
*/
@Override
общественная строка getServletInfo() {
вернуть «Краткое описание»;
}// </editor-fold>
}
Скопируйте код кода следующим образом:
Информация о публичном классе расширяет HttpServlet {
/**
* Обрабатывает запросы как для HTTP
* <code>GET</code> и
* Методы <code>POST</code>.
*
* @param запрос сервлета запроса
* @param ответ ответа сервлета
* @throws ServletException, если возникает ошибка, связанная с сервлетом
* @throws IOException при возникновении ошибки ввода-вывода
*/
protected voidprocessRequest (запрос HttpServletRequest, ответ HttpServletResponse)
выдает ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
HttpSession session=request.getSession();
String info=(String)session.getAttribute("информация");
пытаться {
/* TODO выведите сюда свою страницу. Вы можете использовать следующий пример кода */.
если (информация == ноль)
out.print("ноль");
еще
out.print(информация);
} окончательно {
выход.закрыть();
}
}
// <editor-fold defaultstate="collapsed" desc="Методы HttpServlet. Нажмите на знак + слева, чтобы отредактировать код.">
/**
* Обрабатывает HTTP
* Метод <code>GET</code>.
*
* @param запрос сервлета запроса
* @param ответ ответа сервлета
* @throws ServletException, если возникает ошибка, связанная с сервлетом
* @throws IOException при возникновении ошибки ввода-вывода
*/
@Override
protected void doGet (запрос HttpServletRequest, ответ HttpServletResponse)
выдает ServletException, IOException {
ProcessRequest (запрос, ответ);
}
/**
* Обрабатывает HTTP
* Метод <code>POST</code>.
*
* @param запрос сервлета запроса
* @param ответ ответа сервлета
* @throws ServletException, если возникает ошибка, связанная с сервлетом
* @throws IOException при возникновении ошибки ввода-вывода
*/
@Override
protected void doPost (запрос HttpServletRequest, ответ HttpServletResponse)
выдает ServletException, IOException {
ProcessRequest (запрос, ответ);
}
/**
* Возвращает краткое описание сервлета.
*
* @return строку, содержащую описание сервлета
*/
@Override
общественная строка getServletInfo() {
вернуть «Краткое описание»;
}// </editor-fold>
}
Основной код находится в ProcessRequest, остальные смотреть не нужно.
При доступе к входу в систему передайте значение с именем info. В это время браузер получит файл cookie, используемый для определения местоположения сеанса сервера. Затем посетите «Информация». Если файл cookie есть, сервер может найти только что переданное вами значение и вернуть его вам. Если файл cookie отсутствует, его невозможно найти.
Боковой код Android:
Скопируйте код кода следующим образом:
публичный класс MainActivity расширяет Activity {
частный AndroidHttpClient mHttpclient=AndroidHttpClient.newInstance("");
@Override
public void onCreate (Bundle saveInstanceState) {
super.onCreate(saveInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.button1).setOnClickListener(new OnClickListener() {
@Override
общественная недействительность onClick (Просмотр v) {
// TODO Автоматически сгенерированная заглушка метода
новый поток (rTest).start();
}
});
}
частная строка toString (InputStream is) выдает IOException {
Строка ret="";
InputStreamReader isr = новый InputStreamReader (is);
BufferedReader br = новый BufferedReader (ISR);
Строка tmp=br.readLine();
в то время как (tmp! = ноль) {
рет+=тмп;
tmp=br.readLine();
}
бр.закрыть();
вернуть возврат;
}
частный Runnable rTest = новый Runnable () {
@Override
общественный недействительный запуск () {
// TODO Автоматически сгенерированная заглушка метода
пытаться {
Контекст BasicHttpContext = новый BasicHttpContext ();
context.setAttribute(ClientContext.COOKIE_STORE,new BasicCookieStore());
HttpPost httppost = новый HttpPost("http://10.226.233.48:8080/WebApplication1/LogIn");
Список <NameValuePair> nvps = новый ArrayList <NameValuePair>();
nvps.add(new BasicNameValuePair("info", "Hello world!!"));
httppost.setEntity(new UrlEncodedFormEntity(nvps,"utf-8"));
HttpResponse ответ = mHttpclient.execute (httppost, контекст);
Объект HttpEntity = response.getEntity();
Log.i("кагами", MainActivity.this.toString(entity.getContent()));
сущность.consumeContent();
HttpGet httpget2 = новый HttpGet("http://10.226.233.48:8080/WebApplication1/Info");
HttpResponse response2=mHttpclient.execute(httpget2,context);
HttpEntityentity2 = response2.getEntity();
Log.i("kagami", MainActivity.this.toString(entity2.getContent()));
entity2.consumeContent();
} catch (IOException e) {
// TODO Автоматически сгенерированный блок catch
е.printStackTrace();
}
}
};
}
Разница между AndroidHttpClient и DefaultHttpClient :
AndroidHttpClient не может быть выполнен в основном потоке и выдает исключение. AndroidHttpClient получает экземпляр с помощью статического метода newInstance. Параметр — это прокси. Если прокси не используется, введите «». DefaultHttpClient по умолчанию включает файлы cookie. AndroidHttpClient не включает файлы cookie по умолчанию. Чтобы использовать его, добавьте параметр HttpContext и добавляйте CookieStore при каждом выполнении. Не забудьте закрыть после использования, иначе вы не сможете создать новый экземпляр.