12_Android中HttpClient的应用,doGet,doPost,doHttpClientGet,doHttpClient请求,另外借助第三方框架实现网络连接的应用,

简介: 准备条件,编写一个web项目。编写一个servlet,若用户名为lisi,密码为123,则返回“登录成功”,否则”登录失败”。项目名为ServerItheima28。代码如下: package com.itheima28.servlet;   import java.io.IOException; import java.io.PrintWriter;

  1. 准备条件,

  1. 编写一个web项目。编写一个servlet,若用户名为lisi,密码为123,则返回登录成功,否则登录失败。项目名为ServerItheima28。代码如下:

package com.itheima28.servlet;

 

import java.io.IOException;

import java.io.PrintWriter;

 

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

 

public class LoginServlet extends HttpServlet {

 

         /**

          * The doGet method of the servlet. <br>

          *

          * This method is called when a form has its tag value method equals to get.

          *

          * @param request the request send by the client to the server

          * @param response the response send by the server to the client

          * @throws ServletException if an error occurred

          * @throws IOException if an error occurred

          */

         public void doGet(HttpServletRequest request, HttpServletResponse response)

                            throws ServletException, IOException {

                   String username = request.getParameter("username");       // 采用的编码是: iso-8859-1

                   String password = request.getParameter("password");

                  

                   // 采用iso8859-1的编码对姓名进行逆转, 转换成字节数组, 再使用utf-8编码对数据进行转换, 字符串

                   username = new String(username.getBytes("iso8859-1"), "utf-8");

                   password = new String(password.getBytes("iso8859-1"), "utf-8");

                  

                   System.out.println("姓名: " + username);

                   System.out.println("密码: " + password);

                  

                   if("lisi".equals(username) && "123".equals(password)) {

                            /*

                             * getBytes 默认情况下, 使用的iso8859-1的编码, 但如果发现码表中没有当前字符,

                             * 会使用当前系统下的默认编码: GBK

                             */

                            response.getOutputStream().write("登录成功".getBytes("utf-8"));

                   } else {

                            response.getOutputStream().write("登录失败".getBytes("utf-8"));

                   }

         }

 

         /**

          * The doPost method of the servlet. <br>

          *

          * This method is called when a form has its tag value method equals to post.

          *

          * @param request the request send by the client to the server

          * @param response the response send by the server to the client

          * @throws ServletException if an error occurred

          * @throws IOException if an error occurred

          */

         public void doPost(HttpServletRequest request, HttpServletResponse response)

                            throws ServletException, IOException {

                   System.out.println("doPost");

                   doGet(request, response);

         }

 

}

 

  1. 使用github上的android-async-http-master框架:

2 编写Android应用,应用截图如下:

代码结构如下:

清单文件

<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

    package="com.itheim28.submitdata"

    android:versionCode="1"

    android:versionName="1.0" >

 

    <uses-sdk

        android:minSdkVersion="8"

        android:targetSdkVersion="19" />

    <uses-permission android:name="android.permission.INTERNET"/>

 

    <application

        android:allowBackup="true"

        android:icon="@drawable/ic_launcher"

        android:label="@string/app_name"

        android:theme="@style/AppTheme" >

        <activity

            android:name="com.itheim28.submitdata.MainActivity"

            android:label="@string/app_name" >

            <intent-filter>

                <action android:name="android.intent.action.MAIN" />

 

                <category android:name="android.intent.category.LAUNCHER" />

            </intent-filter>

        </activity>

    </application>

 

</manifest>

3  编写布局文件activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    xmlns:tools="http://schemas.android.com/tools"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:orientation="vertical"

    tools:context=".MainActivity" >

 

    <EditText

        android:id="@+id/et_username"

        android:layout_width="fill_parent"

        android:layout_height="wrap_content"

        android:hint="请输入姓名" />

 

    <EditText

        android:id="@+id/et_password"

        android:layout_width="fill_parent"

        android:layout_height="wrap_content"

        android:hint="请输入密码" />

 

    <Button

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:onClick="doGet"

        android:text="Get方式提交" />

 

    <Button

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:onClick="doPost"

        android:text="Post方式提交" />

   

    <Button

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:onClick="doHttpClientOfGet"

        android:text="使用HttpClient方式提交Get请求" />

 

    <Button

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:onClick="doHttpClientOfPost"

        android:text="使用HttpClient方式提交Post请求" />

</LinearLayout>

4 NetUtils的内容如下:

package com.itheim28.submitdata.utils;

 

import java.io.ByteArrayOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.io.OutputStream;

import java.net.HttpURLConnection;

import java.net.URL;

import java.net.URLEncoder;

 

import android.util.Log;

 

public class NetUtils {

 

         private static final String TAG = "NetUtils";

 

         /**

          * 使用post的方式登录

          *

          * @param userName

          * @param password

          * @return

          */

         public static String loginOfPost(String userName, String password) {

                   HttpURLConnection conn = null;

                   try {

                            URL url = new URL(

                                              "http://114.215.142.191:8080/ServerItheima28/servlet/LoginServlet");

 

                            conn = (HttpURLConnection) url.openConnection();

 

                            conn.setRequestMethod("POST");

                            conn.setConnectTimeout(10000); // 连接的超时时间

                            conn.setReadTimeout(5000); // 读数据的超时时间

                            conn.setDoOutput(true); // 必须设置此方法, 允许输出

                            // conn.setRequestProperty("Content-Length", 234); // 设置请求头消息,

                            // 可以设置多个

 

                            // post请求的参数

                            String data = "username=" + userName + "&password=" + password;

 

                            // 获得一个输出流, 用于向服务器写数据, 默认情况下, 系统不允许向服务器输出内容

                            OutputStream out = conn.getOutputStream();

                            out.write(data.getBytes());

                            out.flush();

                            out.close();

 

                            int responseCode = conn.getResponseCode();

                            if (responseCode == 200) {

                                     InputStream is = conn.getInputStream();

                                     String state = getStringFromInputStream(is);

                                     return state;

                            } else {

                                     Log.i(TAG, "访问失败: " + responseCode);

                            }

                   } catch (Exception e) {

                            e.printStackTrace();

                   } finally {

                            if (conn != null) {

                                     conn.disconnect();

                            }

                   }

                   return null;

         }

 

         /**

          * 使用get的方式登录

          *

          * @param userName

          * @param password

          * @return 登录的状态

          */

         public static String loginOfGet(String userName, String password) {

                   HttpURLConnection conn = null;

                   try {

                            String data = "username=" + URLEncoder.encode(userName)

                                               + "&password=" + URLEncoder.encode(password);

                            URL url = new URL(

                                               "http://114.215.142.191:8080/ServerItheima28/servlet/LoginServlet?"

                                                                 + data);

                            conn = (HttpURLConnection) url.openConnection();

 

                            conn.setRequestMethod("GET"); // get或者post必须得全大写

                            conn.setConnectTimeout(10000); // 连接的超时时间

                            conn.setReadTimeout(5000); // 读数据的超时时间

 

                            int responseCode = conn.getResponseCode();

                            if (responseCode == 200) {

                                     InputStream is = conn.getInputStream();

                                     String state = getStringFromInputStream(is);

                                     return state;

                            } else {

                                     Log.i(TAG, "访问失败: " + responseCode);

                            }

                   } catch (Exception e) {

                            e.printStackTrace();

                   } finally {

                            if (conn != null) {

                                     conn.disconnect(); // 关闭连接

                            }

                   }

                   return null;

         }

 

         /**

          * 根据流返回一个字符串信息

          *

          * @param is

          * @return

          * @throws IOException

          */

         private static String getStringFromInputStream(InputStream is)

                            throws IOException {

                   ByteArrayOutputStream baos = new ByteArrayOutputStream();

                   byte[] buffer = new byte[1024];

                   int len = -1;

 

                   while ((len = is.read(buffer)) != -1) {

                            baos.write(buffer, 0, len);

                   }

                   is.close();

 

                   String html = baos.toString(); // 把流中的数据转换成字符串, 采用的编码是: utf-8

 

                   // String html = new String(baos.toByteArray(), "GBK");

 

                   baos.close();

                   return html;

         }

}

5 NetUtils2代码如下:

package com.itheim28.submitdata.utils;

 

import java.io.ByteArrayOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.util.ArrayList;

import java.util.List;

 

import org.apache.http.HttpResponse;

import org.apache.http.NameValuePair;

import org.apache.http.client.HttpClient;

import org.apache.http.client.entity.UrlEncodedFormEntity;

import org.apache.http.client.methods.HttpGet;

import org.apache.http.client.methods.HttpPost;

import org.apache.http.impl.client.DefaultHttpClient;

import org.apache.http.message.BasicNameValuePair;

 

import android.util.Log;

 

public class NetUtils2 {

 

         private static final String TAG = "NetUtils";

 

         /**

          * 使用post的方式登录

          *

          * @param userName

          * @param password

          * @return

          */

         public static String loginOfPost(String userName, String password) {

                   HttpClient client = null;

                   try {

                            // 定义一个客户端

                            client = new DefaultHttpClient();

 

                            // 定义post方法

                            HttpPost post = new HttpPost(

                                              "http://114.215.142.191:8080/ServerItheima28/servlet/LoginServlet");

 

                            // 定义post请求的参数

                            List<NameValuePair> parameters = new ArrayList<NameValuePair>();

                            parameters.add(new BasicNameValuePair("username", userName));

                            parameters.add(new BasicNameValuePair("password", password));

 

                            // post请求的参数包装了一层.

 

                            // 不写编码名称服务器收数据时乱码. 需要指定字符集为utf-8

                            UrlEncodedFormEntity entity = new UrlEncodedFormEntity(parameters,

                                               "utf-8");

                            // 设置参数.

                            post.setEntity(entity);

 

                            // 设置请求头消息

                            // post.addHeader("Content-Length", "20");

 

                            // 使用客户端执行post方法

                            HttpResponse response = client.execute(post); // 开始执行post请求,

                                                                                                                                            // 会返回给我们一个HttpResponse对象

 

                            // 使用响应对象, 获得状态码, 处理内容

                            int statusCode = response.getStatusLine().getStatusCode(); // 获得状态码

                            if (statusCode == 200) {

                                     // 使用响应对象获得实体, 获得输入流

                                     InputStream is = response.getEntity().getContent();

                                     String text = getStringFromInputStream(is);

                                      return text;

                            } else {

                                     Log.i(TAG, "请求失败: " + statusCode);

                            }

                   } catch (Exception e) {

                            e.printStackTrace();

                   } finally {

                            if (client != null) {

                                     client.getConnectionManager().shutdown(); // 关闭连接和释放资源

                            }

                   }

                   return null;

         }

 

         /**

          * 使用get的方式登录

          *

          * @param userName

          * @param password

          * @return 登录的状态

          */

         public static String loginOfGet(String userName, String password) {

                   HttpClient client = null;

                   try {

                            // 定义一个客户端

                            client = new DefaultHttpClient();

 

                            // 定义一个get请求方法

                            String data = "username=" + userName + "&password=" + password;

                            HttpGet get = new HttpGet(

                                               "http://114.215.142.191:8080/ServerItheima28/servlet/LoginServlet?" + data);

 

                            // response 服务器相应对象, 其中包含了状态信息和服务器返回的数据

                            // 开始执行get方法, 请求网络

                            HttpResponse response = client.execute(get);

 

                            // 获得响应码

                            int statusCode = response.getStatusLine().getStatusCode();

 

                            if (statusCode == 200) {

                                     InputStream is = response.getEntity().getContent();

                                     String text = getStringFromInputStream(is);

                                     return text;

                            } else {

                                     Log.i(TAG, "请求失败: " + statusCode);

                            }

                   } catch (Exception e) {

                            e.printStackTrace();

                   } finally {

                            if (client != null) {

                                     client.getConnectionManager().shutdown(); // 关闭连接, 和释放资源

                            }

                   }

                   return null;

         }

 

         /**

          * 根据流返回一个字符串信息

          *

          * @param is

          * @return

          * @throws IOException

          */

         private static String getStringFromInputStream(InputStream is)

                            throws IOException {

                   ByteArrayOutputStream baos = new ByteArrayOutputStream();

                   byte[] buffer = new byte[1024];

                   int len = -1;

 

                   while ((len = is.read(buffer)) != -1) {

                            baos.write(buffer, 0, len);

                   }

                   is.close();

 

                   String html = baos.toString(); // 把流中的数据转换成字符串, 采用的编码是: utf-8

 

                   // String html = new String(baos.toByteArray(), "GBK");

 

                   baos.close();

                   return html;

         }

}

6 MainActivity代码如下:

package com.itheim28.submitdata;

 

import android.app.Activity;

import android.os.Bundle;

import android.text.TextUtils;

import android.util.Log;

import android.view.View;

import android.widget.EditText;

import android.widget.Toast;

 

import com.itheim28.submitdata.utils.NetUtils;

import com.itheim28.submitdata.utils.NetUtils2;

 

public class MainActivity extends Activity {

 

         private static final String TAG = "MainActivity";

         private EditText etUserName;

         private EditText etPassword;

 

         @Override

         protected void onCreate(Bundle savedInstanceState) {

                   super.onCreate(savedInstanceState);

                   setContentView(R.layout.activity_main);

 

                   etUserName = (EditText) findViewById(R.id.et_username);

                   etPassword = (EditText) findViewById(R.id.et_password);

         }

 

         /**

          * 使用httpClient方式提交get请求

          *

          * @param v

          */

         public void doHttpClientOfGet(View v) {

                   Log.i(TAG, "doHttpClientOfGet");

                   final String userName = etUserName.getText().toString();

                   final String password = etPassword.getText().toString();

 

                   new Thread(new Runnable() {

 

                            @Override

                            public void run() {

                                     // 请求网络

                                     final String state = NetUtils2.loginOfGet(userName, password);

                                     // 执行任务在主线程中

                                     runOnUiThread(new Runnable() {

                                               @Override

                                               public void run() {

                                                        // 就是在主线程中操作

                                                        Toast.makeText(MainActivity.this, state, 0).show();

                                               }

                                     });

                            }

                   }).start();

         }

 

         /**

          * 使用httpClient方式提交post请求

          *

          * @param v

          */

         public void doHttpClientOfPost(View v) {

                   Log.i(TAG, "doHttpClientOfPost");

                   final String userName = etUserName.getText().toString();

                   final String password = etPassword.getText().toString();

 

                   new Thread(new Runnable() {

                            @Override

                            public void run() {

                                     final String state = NetUtils2.loginOfPost(userName, password);

                                     // 执行任务在主线程中

                                     runOnUiThread(new Runnable() {

                                               @Override

                                               public void run() {

                                                        // 就是在主线程中操作

                                                        Toast.makeText(MainActivity.this, state, 0).show();

                                               }

                                     });

                            }

                   }).start();

         }

 

         public void doGet(View v) {

                   final String userName = etUserName.getText().toString();

                   final String password = etPassword.getText().toString();

 

                   new Thread(new Runnable() {

 

                            @Override

                            public void run() {

                                     // 使用get方式抓去数据

                                     final String state = NetUtils.loginOfGet(userName, password);

 

                                     // 执行任务在主线程中

                                     runOnUiThread(new Runnable() {

                                               @Override

                                               public void run() {

                                                        // 就是在主线程中操作

                                                        Toast.makeText(MainActivity.this, state, 0).show();

                                               }

                                     });

                            }

                   }).start();

         }

 

         public void doPost(View v) {

                   final String userName = etUserName.getText().toString();

                   final String password = etPassword.getText().toString();

 

                   new Thread(new Runnable() {

                            @Override

                            public void run() {

                                     final String state = NetUtils.loginOfPost(userName, password);

                                     // 执行任务在主线程中

                                     runOnUiThread(new Runnable() {

                                               @Override

                                               public void run() {

                                                        // 就是在主线程中操作

                                                        Toast.makeText(MainActivity.this, state, 0).show();

                                               }

                                     });

                            }

                   }).start();

         }

}

7 MainActivity2 的代码如下:

package com.itheim28.submitdata;

 

import java.net.URLEncoder;

 

import org.apache.http.Header;

 

import android.app.Activity;

import android.os.Bundle;

import android.view.View;

import android.widget.EditText;

import android.widget.Toast;

 

import com.loopj.android.http.AsyncHttpClient;

import com.loopj.android.http.AsyncHttpResponseHandler;

import com.loopj.android.http.RequestParams;

 

public class MainActivity2 extends Activity {

 

    protected static final String TAG = "MainActivity2";

    private EditText etUserName;

    private EditText etPassword;

 

    @Override

    protected void onCreate(Bundle savedInstanceState) {

       super.onCreate(savedInstanceState);

       setContentView(R.layout.activity_main);

 

       etUserName = (EditText) findViewById(R.id.et_username);

       etPassword = (EditText) findViewById(R.id.et_password);

    }

 

    public void doGet(View v) {

       final String userName = etUserName.getText().toString();

       final String password = etPassword.getText().toString();

 

       AsyncHttpClient client = new AsyncHttpClient();

 

       String data = "username=" + URLEncoder.encode(userName) + "&password="

              + URLEncoder.encode(password);

 

        client.get("http://114.215.142.191:8080/ServerItheima28/servlet/LoginServlet?"

              + data, new MyResponseHandler());

    }

 

    public void doPost(View v) {

       final String userName = etUserName.getText().toString();

       final String password = etPassword.getText().toString();

 

       AsyncHttpClient client = new AsyncHttpClient();

 

       RequestParams params = new RequestParams();

       params.put("username", userName);

       params.put("password", password);

 

       client.post(

               "http://114.215.142.191:8080/ServerItheima28/servlet/LoginServlet",

              params, new MyResponseHandler());

    }

 

    class MyResponseHandler extends AsyncHttpResponseHandler {

 

       @Override

       public void onSuccess(int statusCode, Header[] headers,

              byte[] responseBody) {

           // Log.i(TAG, "statusCode: " + statusCode);

 

           Toast.makeText(

                  MainActivity2.this,

                  "成功: statusCode: " + statusCode + ", body: "

                         + new String(responseBody), 0).show();

       }

 

       @Override

       public void onFailure(int statusCode, Header[] headers,

              byte[] responseBody, Throwable error) {

           Toast.makeText(MainActivity2.this, "失败: statusCode: " + statusCode,

                  0).show();

       }

    }

}

 

 

 

 

 

 

 

 

 

 

 

 

 

目录
相关文章
|
3天前
|
容灾 网络协议 数据库
云卓越架构:云上网络稳定性建设和应用稳定性治理最佳实践
本文介绍了云上网络稳定性体系建设的关键内容,包括面向失败的架构设计、可观测性与应急恢复、客户案例及阿里巴巴的核心电商架构演进。首先强调了网络稳定性的挑战及其应对策略,如责任共担模型和冗余设计。接着详细探讨了多可用区部署、弹性架构规划及跨地域容灾设计的最佳实践,特别是阿里云的产品和技术如何助力实现高可用性和快速故障恢复。最后通过具体案例展示了秒级故障转移的效果,以及同城多活架构下的实际应用。这些措施共同确保了业务在面对网络故障时的持续稳定运行。
|
27天前
|
Kubernetes 安全 Devops
有效抵御网络应用及API威胁,聊聊F5 BIG-IP Next Web应用防火墙
有效抵御网络应用及API威胁,聊聊F5 BIG-IP Next Web应用防火墙
59 10
有效抵御网络应用及API威胁,聊聊F5 BIG-IP Next Web应用防火墙
|
5天前
|
负载均衡 容灾 Cloud Native
云原生应用网关进阶:阿里云网络ALB Ingress 全能增强
在过去半年,ALB Ingress Controller推出了多项高级特性,包括支持AScript自定义脚本、慢启动、连接优雅中断等功能,增强了产品的灵活性和用户体验。此外,还推出了ingress2Albconfig工具,方便用户从Nginx Ingress迁移到ALB Ingress,以及通过Webhook服务实现更智能的配置校验,减少错误配置带来的影响。在容灾部署方面,支持了多集群网关,提高了系统的高可用性和容灾能力。这些改进旨在为用户提供更强大、更安全的云原生网关解决方案。
61 6
|
7天前
|
数据采集 JavaScript 前端开发
异步请求在TypeScript网络爬虫中的应用
异步请求在TypeScript网络爬虫中的应用
|
1月前
|
JSON Java API
探索安卓开发:打造你的首个天气应用
在这篇技术指南中,我们将一起潜入安卓开发的海洋,学习如何从零开始构建一个简单的天气应用。通过这个实践项目,你将掌握安卓开发的核心概念、界面设计、网络编程以及数据解析等技能。无论你是初学者还是有一定基础的开发者,这篇文章都将为你提供一个清晰的路线图和实用的代码示例,帮助你在安卓开发的道路上迈出坚实的一步。让我们一起开始这段旅程,打造属于你自己的第一个安卓应用吧!
60 14
|
1月前
|
Java Linux 数据库
探索安卓开发:打造你的第一款应用
在数字时代的浪潮中,每个人都有机会成为创意的实现者。本文将带你走进安卓开发的奇妙世界,通过浅显易懂的语言和实际代码示例,引导你从零开始构建自己的第一款安卓应用。无论你是编程新手还是希望拓展技术的开发者,这篇文章都将为你打开一扇门,让你的创意和技术一起飞扬。
|
1月前
|
存储 安全 网络安全
网络安全的盾与剑:漏洞防御与加密技术的实战应用
在数字化浪潮中,网络安全成为保护信息资产的重中之重。本文将深入探讨网络安全的两个关键领域——安全漏洞的防御策略和加密技术的应用,通过具体案例分析常见的安全威胁,并提供实用的防护措施。同时,我们将展示如何利用Python编程语言实现简单的加密算法,增强读者的安全意识和技术能力。文章旨在为非专业读者提供一扇了解网络安全复杂世界的窗口,以及为专业人士提供可立即投入使用的技术参考。
|
1月前
|
搜索推荐 前端开发 测试技术
打造个性化安卓应用:从设计到开发的全面指南
在这个数字时代,拥有一个定制的移动应用不仅是一种趋势,更是个人或企业品牌的重要延伸。本文将引导你通过一系列简单易懂的步骤,从构思你的应用理念开始,直至实现一个功能齐全的安卓应用。无论你是编程新手还是希望拓展技能的开发者,这篇文章都将为你提供必要的工具和知识,帮助你将创意转化为现实。
|
2月前
|
网络协议 物联网 数据处理
C语言在网络通信程序实现中的应用,介绍了网络通信的基本概念、C语言的特点及其在网络通信中的优势
本文探讨了C语言在网络通信程序实现中的应用,介绍了网络通信的基本概念、C语言的特点及其在网络通信中的优势。文章详细讲解了使用C语言实现网络通信程序的基本步骤,包括TCP和UDP通信程序的实现,并讨论了关键技术、优化方法及未来发展趋势,旨在帮助读者掌握C语言在网络通信中的应用技巧。
52 2
|
1月前
|
Java Android开发 开发者
探索安卓开发:构建你的第一个“Hello World”应用
在安卓开发的浩瀚海洋中,每个新手都渴望扬帆起航。本文将作为你的指南针,引领你通过创建一个简单的“Hello World”应用,迈出安卓开发的第一步。我们将一起搭建开发环境、了解基本概念,并编写第一行代码。就像印度圣雄甘地所说:“你必须成为你希望在世界上看到的改变。”让我们一起开始这段旅程,成为我们想要见到的开发者吧!
38 0

热门文章

最新文章