أرغب اليوم في نقل برنامج تسجيل الدخول التلقائي باستخدام HttpClient إلى Android ولحسن الحظ، يأتي Android SDK مع حزمة HttpClient. عند البحث في وثائق Android، وجدت أن المسؤول يوفر أيضًا AndroidHttpClient الذي ينفذ واجهة HttpClient، وقد بحثت عبر الإنترنت ولم أجد أي مقالات حول AndroidHttpClient. بالطبع، يمكنك الاستمرار في استخدام DefaultHttpClient، ولكن من الأفضل بطبيعة الحال استخدام AndroidHttpClient المخصص لنظام Android.
فيما يلي 2 HttpServlets للاختبار :
انسخ رمز الكود كما يلي:
يمتد تسجيل دخول الفئة العامة إلى HttpServlet {
/**
* طلبات العمليات لكلا HTTP
* <code>احصل</code> و
* طرق <code>POST</code>.
*
* @param طلب طلب servlet
* استجابةparam استجابة servlet
*throws ServletException في حالة حدوث خطأ خاص بـ servlet
*throws IOException في حالة حدوث خطأ في الإدخال/الإخراج
*/
معالجة باطلة محمية (طلب HttpServletRequest، استجابة HttpServletResponse)
يلقي ServletException، IOException {
Response.setContentType("text/html;charset=UTF-8");
request.setCharacterEncoding("utf-8");
PrintWriter out = Response.getWriter();
HttpSession session=request.getSession();
String info=request.getParameter("info");
session.setAttribute("info"، معلومات);
يحاول {
/* قم بإخراج صفحتك هنا. يمكنك استخدام نموذج التعليمات البرمجية التالي.
println("موافق");
} أخيراً {
out.Close();
}
}
// <editor-fold defaultstate="collapsed" desc="طرق HttpServlet. انقر على علامة + الموجودة على اليسار لتحرير الكود.">
/**
* يتعامل مع HTTP
* طريقة <code>الحصول</code>.
*
* @param طلب طلب servlet
* استجابةparam استجابة servlet
*throws ServletException في حالة حدوث خطأ خاص بـ servlet
*throws IOException في حالة حدوث خطأ في الإدخال/الإخراج
*/
@تجاوز
doGet باطلة محمية (طلب HttpServletRequest، استجابة HttpServletResponse)
يلقي ServletException، IOException {
ProcessRequest(request, Response);
}
/**
* يتعامل مع HTTP
* طريقة <code>POST</code>.
*
* @param طلب طلب servlet
* استجابةparam استجابة servlet
*throws ServletException في حالة حدوث خطأ خاص بـ servlet
*throws IOException في حالة حدوث خطأ في الإدخال/الإخراج
*/
@تجاوز
doPost باطلة محمية (طلب HttpServletRequest، استجابة HttpServletResponse)
يلقي ServletException، IOException {
ProcessRequest(request, Response);
}
/**
* إرجاع وصف قصير للخادم.
*
*return سلسلة تحتوي على وصف servlet
*/
@تجاوز
سلسلة عامة getServletInfo () {
إرجاع "وصف قصير"؛
}// </editor-fold>
}
انسخ رمز الكود كما يلي:
معلومات الفئة العامة تمتد HttpServlet {
/**
* طلبات العمليات لكلا HTTP
* <code>احصل</code> و
* طرق <code>POST</code>.
*
* @param طلب طلب servlet
* استجابةparam استجابة servlet
*throws ServletException في حالة حدوث خطأ خاص بـ servlet
*throws IOException في حالة حدوث خطأ في الإدخال/الإخراج
*/
معالجة باطلة محمية (طلب HttpServletRequest، استجابة HttpServletResponse)
يلقي ServletException، IOException {
Response.setContentType("text/html;charset=UTF-8");
PrintWriter out = Response.getWriter();
HttpSession session=request.getSession();
String info=(String)session.getAttribute("info");
يحاول {
/* قم بإخراج صفحتك هنا. يمكنك استخدام نموذج التعليمات البرمجية التالي.
إذا (معلومات == فارغة)
print("null");
آخر
print(info);
} أخيراً {
out.Close();
}
}
// <editor-fold defaultstate="collapsed" desc="طرق HttpServlet. انقر على علامة + الموجودة على اليسار لتحرير الكود.">
/**
* يتعامل مع HTTP
* طريقة <code>الحصول</code>.
*
* @param طلب طلب servlet
* استجابةparam استجابة servlet
*throws ServletException في حالة حدوث خطأ خاص بـ servlet
*throws IOException في حالة حدوث خطأ في الإدخال/الإخراج
*/
@تجاوز
doGet باطلة محمية (طلب HttpServletRequest، استجابة HttpServletResponse)
يلقي ServletException، IOException {
ProcessRequest(request, Response);
}
/**
* يتعامل مع HTTP
* طريقة <code>POST</code>.
*
* @param طلب طلب servlet
* استجابةparam استجابة servlet
*throws ServletException في حالة حدوث خطأ خاص بـ servlet
*throws IOException في حالة حدوث خطأ في الإدخال/الإخراج
*/
@تجاوز
doPost باطلة محمية (طلب HttpServletRequest، استجابة HttpServletResponse)
يلقي ServletException، IOException {
ProcessRequest(request, Response);
}
/**
* إرجاع وصف قصير للخادم.
*
*return سلسلة تحتوي على وصف servlet
*/
@تجاوز
سلسلة عامة getServletInfo () {
إرجاع "وصف قصير"؛
}// </editor-fold>
}
الكود الرئيسي قيد المعالجة، ولا تحتاج إلى إلقاء نظرة على الكودات الأخرى.
عند الوصول إلى تسجيل الدخول، قم بتمرير قيمة تسمى المعلومات. في هذا الوقت، سيحصل المتصفح على ملف تعريف ارتباط يستخدم لتحديد موقع جلسة الخادم. ثم قم بزيارة المعلومات. إذا كان هناك ملف تعريف ارتباط، فيمكن للخادم العثور على القيمة التي مررتها للتو وإعادتها إليك. إذا لم يكن هناك ملف تعريف ارتباط، فلا يمكن العثور عليه.
الرمز الجانبي لنظام Android:
انسخ رمز الكود كما يلي:
الطبقة العامة MainActivity تمتد النشاط {
Private AndroidHttpClient mHttpclient=AndroidHttpClient.newInstance("");
@تجاوز
الفراغ العام onCreate(حزمة saveInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.button1).setOnClickListener(new OnClickListener() {
@تجاوز
الفراغ العام عند النقر (عرض v) {
// TODO طريقة تم إنشاؤها تلقائيًا stub
موضوع جديد(rTest).start();
}
});
}
سلسلة خاصة toString(InputStream is) تطرح IOException{
سلسلة ret = ""؛
InputStreamReader isr=new InputStreamReader(is);
BufferedReader br=new BufferedReader(isr);
String tmp=br.readLine();
بينما(تمب!=فارغة){
ret+=tmp;
tmp=br.readLine();
}
br. Close();
عودة متقاعد؛
}
خاص Runnable rTest=new Runnable() {
@تجاوز
تشغيل الفراغ العام () {
// TODO طريقة تم إنشاؤها تلقائيًا stub
يحاول {
BasicHttpContext context=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 Response=mHttpclient.execute(httppost,context);
كيان HttpEntity = Response.getEntity();
Log.i("kagami", 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("kagami", MainActivity.this.toString(entity2.getContent()));
الكيان2.consumeContent();
} قبض (IOException ه) {
// TODO كتلة الالتقاط التي تم إنشاؤها تلقائيًا
printStackTrace();
}
}
};
}
الفرق بين AndroidHttpClient و DefaultHttpClient :
لا يمكن تنفيذ AndroidHttpClient في سلسلة المحادثات الرئيسية وسيطرح استثناءً. يحصل AndroidHttpClient على المثيل من خلال الطريقة الثابتة newInstance، والمعلمة هي الوكيل. إذا لم يتم استخدام الوكيل، فاملأ "". يقوم DefaultHttpClient بتمكين ملفات تعريف الارتباط بشكل افتراضي. ولا يقوم AndroidHttpClient بتمكين ملفات تعريف الارتباط بشكل افتراضي لاستخدامها، أضف معلمة HttpContext وأضف CookieStore في كل مرة تقوم فيها بالتنفيذ. لا تنس الإغلاق بعد الاستخدام، وإلا فلن تتمكن من إنشاء مثيل جديد.