오늘은 HttpClient를 사용하여 자동 체크인 애플릿을 Android로 이식하고 싶습니다. 다행히 Android SDK에는 HttpClient 패키지가 함께 제공됩니다. Android 문서를 살펴보면 공식이 HttpClient 인터페이스를 구현하는 AndroidHttpClient도 제공한다는 것을 알았습니다. 온라인으로 검색한 결과 AndroidHttpClient에 대한 기사가 없습니다. 물론 DefaultHttpClient를 계속 사용해도 되지만, 당연히 안드로이드에 맞게 맞춤화된 AndroidHttpClient를 사용하는 것이 더 좋습니다.
다음은 테스트용 2개의 HttpServlet입니다 .
다음과 같이 코드 코드를 복사합니다 .
공개 클래스 LogIn은 HttpServlet을 확장합니다.
/**
* 두 HTTP 모두에 대한 요청을 처리합니다.
* <code>GET</code> 및
* <code>POST</code> 메소드.
*
* @param 요청 서블릿 요청
* @param 응답 서블릿 응답
* 서블릿 관련 오류가 발생하면 @throws ServletException이 발생합니다.
* I/O 오류가 발생하면 @throws IOException
*/
protected void processRequest(HttpServletRequest 요청, HttpServletResponse 응답)
ServletException, IOException이 발생합니다.
response.setContentType("text/html;charset=UTF-8");
request.setCharacterEncoding("utf-8");
PrintWriter 출력 = response.getWriter();
HttpSession 세션=request.getSession();
String info=request.getParameter("info");
session.setAttribute("info", info);
노력하다 {
/* TODO는 다음 샘플 코드를 사용할 수 있습니다. */
out.println("확인");
} 마지막으로 {
종료.닫기();
}
}
// <editor-fold defaultstate="collapsed" desc="HttpServlet 메소드. 코드를 편집하려면 왼쪽의 + 기호를 클릭하세요.">
/**
* HTTP를 처리합니다
* <code>GET</code> 메소드.
*
* @param 요청 서블릿 요청
* @param 응답 서블릿 응답
* 서블릿 관련 오류가 발생하면 @throws ServletException이 발생합니다.
* I/O 오류가 발생하면 @throws IOException
*/
@보수
protected void doGet(HttpServletRequest 요청, HttpServletResponse 응답)
ServletException, IOException이 발생합니다.
processRequest(요청, 응답);
}
/**
* HTTP를 처리합니다
* <code>POST</code> 방법.
*
* @param 요청 서블릿 요청
* @param 응답 서블릿 응답
* 서블릿 관련 오류가 발생하면 @throws ServletException이 발생합니다.
* I/O 오류가 발생하면 @throws IOException
*/
@보수
protected void doPost(HttpServletRequest 요청, HttpServletResponse 응답)
ServletException, IOException이 발생합니다.
processRequest(요청, 응답);
}
/**
* 서블릿에 대한 간단한 설명을 반환합니다.
*
* @return 서블릿 설명이 포함된 문자열
*/
@보수
공개 문자열 getServletInfo() {
"간단한 설명"을 반환합니다.
}// </editor-fold>
}
다음과 같이 코드 코드를 복사합니다 .
공개 클래스 Info는 HttpServlet을 확장합니다.
/**
* 두 HTTP 모두에 대한 요청을 처리합니다.
* <code>GET</code> 및
* <code>POST</code> 메소드.
*
* @param 요청 서블릿 요청
* @param 응답 서블릿 응답
* 서블릿 관련 오류가 발생하면 @throws ServletException이 발생합니다.
* I/O 오류가 발생하면 @throws IOException
*/
protected void processRequest(HttpServletRequest 요청, HttpServletResponse 응답)
ServletException, IOException이 발생합니다.
response.setContentType("text/html;charset=UTF-8");
PrintWriter 출력 = response.getWriter();
HttpSession 세션=request.getSession();
String info=(String)session.getAttribute("info");
노력하다 {
/* TODO는 다음 샘플 코드를 사용할 수 있습니다. */
if(정보==null)
out.print("null");
또 다른
out.print(정보);
} 마지막으로 {
종료.닫기();
}
}
// <editor-fold defaultstate="collapsed" desc="HttpServlet 메소드. 코드를 편집하려면 왼쪽의 + 기호를 클릭하세요.">
/**
* HTTP를 처리합니다
* <code>GET</code> 메소드.
*
* @param 요청 서블릿 요청
* @param 응답 서블릿 응답
* 서블릿 관련 오류가 발생하면 @throws ServletException이 발생합니다.
* I/O 오류가 발생하면 @throws IOException
*/
@보수
protected void doGet(HttpServletRequest 요청, HttpServletResponse 응답)
ServletException, IOException이 발생합니다.
processRequest(요청, 응답);
}
/**
* HTTP를 처리합니다
* <code>POST</code> 방법.
*
* @param 요청 서블릿 요청
* @param 응답 서블릿 응답
* 서블릿 관련 오류가 발생하면 @throws ServletException이 발생합니다.
* I/O 오류가 발생하면 @throws IOException
*/
@보수
protected void doPost(HttpServletRequest 요청, HttpServletResponse 응답)
ServletException, IOException이 발생합니다.
processRequest(요청, 응답);
}
/**
* 서블릿에 대한 간단한 설명을 반환합니다.
*
* @return 서블릿 설명이 포함된 문자열
*/
@보수
공개 문자열 getServletInfo() {
"간단한 설명"을 반환합니다.
}// </editor-fold>
}
기본 코드는 processRequest에 있으므로 다른 코드는 볼 필요가 없습니다.
LogIn에 액세스할 때 info라는 값을 전달하면 브라우저는 서버 세션을 찾는 데 사용되는 쿠키를 가져옵니다. 그런 다음 Info를 방문하세요. 쿠키가 있으면 서버는 방금 전달한 값을 찾아 반환할 수 있습니다. 쿠키가 없으면 찾을 수 없습니다.
안드로이드 사이드 코드:
다음과 같이 코드 코드를 복사합니다 .
공개 클래스 MainActivity는 활동을 확장합니다.
개인 AndroidHttpClient mHttpclient=AndroidHttpClient.newInstance("");
@보수
공공 무효 onCreate(번들에 저장된InstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.button1).setOnClickListener(new OnClickListener() {
@보수
공개 무효 onClick(보기 v) {
// TODO 자동 생성된 메서드 스텁
새로운 Thread(rTest).start();
}
});
}
개인 문자열 toString(InputStream is)이 IOException을 발생시킵니다.
문자열 ret="";
InputStreamReader isr=new InputStreamReader(is);
BufferedReader br=new BufferedReader(isr);
문자열 tmp=br.readLine();
동안(tmp!=null){
ret+=tmp;
tmp=br.readLine();
}
br.닫기();
반환 ret;
}
개인 Runnable rTest=new Runnable() {
@보수
공개 무효 실행() {
// TODO 자동 생성된 메서드 스텁
노력하다 {
BasicHttpContext 컨텍스트=new BasicHttpContext();
context.setAttribute(ClientContext.COOKIE_STORE,new BasicCookieStore());
HttpPost httppost = new HttpPost("http://10.226.233.48:8080/WebApplication1/LogIn");
List <NameValuePair> nvps = new ArrayList <NameValuePair>();
nvps.add(new BasicNameValuePair("info", "Hello world!!"));
httppost.setEntity(new UrlEncodedFormEntity(nvps,"utf-8"));
HttpResponse 응답=mHttpclient.execute(httppost,context);
HttpEntity 엔터티 = response.getEntity();
Log.i("카가미", MainActivity.this.toString(entity.getContent()));
엔터티.consumeContent();
HttpGet httpget2 = new HttpGet("http://10.226.233.48:8080/WebApplication1/Info");
HttpResponse response2=mHttpclient.execute(httpget2,context);
HttpEntity 엔터티2 = response2.getEntity();
Log.i("카가미", MainActivity.this.toString(entity2.getContent()));
엔터티2.consumeContent();
} 잡기(IOException e) {
// TODO 자동 생성된 캐치 블록
e.printStackTrace();
}
}
};
}
AndroidHttpClient와 DefaultHttpClient의 차이점은 다음과 같습니다 .
AndroidHttpClient는 메인 스레드에서 실행될 수 없으며 예외가 발생합니다. AndroidHttpClient는 정적 메소드 newInstance를 통해 인스턴스를 얻습니다. 매개변수는 프록시를 사용하지 않는 경우 ""를 입력합니다. DefaultHttpClient는 기본적으로 쿠키를 활성화하지만, AndroidHttpClient는 기본적으로 쿠키를 활성화하지 않습니다. 이를 사용하려면 실행할 때마다 HttpContext 매개변수를 추가하고 CookieStore를 추가해야 합니다. 사용 후에는 반드시 닫아주세요. 그렇지 않으면 새 인스턴스를 생성할 수 없습니다.