今日は、HttpClient を使用した自動チェックイン アプレットを Android に移植したいと思います。幸いなことに、Android SDK には HttpClient パッケージが付属しています。 Android のドキュメントを調べていると、HttpClient インターフェイスを実装する AndroidHttpClient も公式で提供されていることがわかりました。オンラインで検索しても、AndroidHttpClient に関する記事は見つかりませんでした。もちろん、DefaultHttpClient を引き続き使用することもできますが、Android 用にカスタマイズされた AndroidHttpClient を使用する方が当然優れています。
以下はテスト用の 2 つの HttpServlet です。
次のようにコードをコピーします。
public class LogIn extends 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();
文字列 info=request.getParameter("info");
session.setAttribute("情報", 情報);
試す {
/* TODO はここにページを出力します。次のサンプルコードを使用できます。
out.println("OK");
} ついに {
out.close();
}
}
// <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 サーブレットの説明を含む文字列を返します
*/
@オーバーライド
public String getServletInfo() {
"簡単な説明" を返します。
}// </editor-fold>
}
次のようにコードをコピーします。
public class Info extends 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(情報);
} ついに {
out.close();
}
}
// <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 サーブレットの説明を含む文字列を返します
*/
@オーバーライド
public String getServletInfo() {
"簡単な説明" を返します。
}// </editor-fold>
}
メインコードは processRequest 内にあるため、他のコードを確認する必要はありません。
LogIn にアクセスするときに、info という名前の値を渡します。このとき、ブラウザーはサーバー セッションを見つけるために使用される Cookie を取得します。次に、「情報」にアクセスします。Cookie がある場合、サーバーは渡された値を見つけて返すことができます。Cookie がない場合は、値が見つかりません。
Android 側のコード:
次のようにコードをコピーします。
public class MainActivity extends Activity {
private AndroidHttpClient mHttpclient=AndroidHttpClient.newInstance("");
@オーバーライド
public void onCreate(バンドル保存インスタンス状態) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.button1).setOnClickListener(new OnClickListener() {
@オーバーライド
public void onClick(View v) {
// TODO 自動生成されたメソッド スタブ
新しいスレッド(rTest).start();
}
});
}
private String toString(InputStream is) throws IOException{
文字列 ret="";
InputStreamReader isr=新しいInputStreamReader(is);
BufferedReader br=new BufferedReader(isr);
文字列 tmp=br.readLine();
while(tmp!=null){
ret+=tmp;
tmp=br.readLine();
}
br.close();
retを返します。
}
private Runnable rTest=new Runnable() {
@オーバーライド
public void run() {
// TODO 自動生成されたメソッド スタブ
試す {
BasicHttpContext context=new BasicHttpContext();
context.setAttribute(ClientContext.COOKIE_STORE,new BasicCookieStore());
HttpPost httppost = new HttpPost("http://10.226.233.48:8080/WebApplication1/LogIn");
リスト <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 応答 2=mHttpclient.execute(httpget2,context);
HttpEntity エンティティ 2 = 応答 2.getEntity();
Log.i("鏡", MainActivity.this.toString(entity2.getContent()));
エンティティ2.consumeContent();
} キャッチ (IOException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}
}
};
}
AndroidHttpClient と DefaultHttpClient の違い:
AndroidHttpClient はメインスレッドで実行できないため、例外がスローされます。 AndroidHttpClient は静的メソッド newInstance を通じてインスタンスを取得します。プロキシを使用しない場合は、「」を入力します。 DefaultHttpClient はデフォルトで Cookie を有効にしますが、AndroidHttpClient はデフォルトで Cookie を有効にしません。これを使用するには、実行するたびに HttpContext パラメータを追加し、CookieStore を追加します。使用後は忘れずに閉じてください。閉じないと、新しいインスタンスを作成できなくなります。