• Android-HttpClient-Get与Post请求登录功能


    HttpClient 是org.apache.http.* 包中的;

     

    第一种方式使用httpclient-*.jar (需要在网上去下载httpclient-*.jar包)

    把httpclient-4.5.jar/httpclient-4.4.1.jar包放入到libs里,然后点击sync project ...才能使用httpclient-4.5.jar包

    httpclient-4.5.jar不好用,建议使用httpclient-4.4.1.jar

    第二种方式:配置AndroidStudio 的方式获取 HttpClient

    在相应的module下的build.gradle中加入:useLibrary 'org.apache.http.legacy'

    这条语句一定要加在 android{ } 当中,然后rebulid

    例如:


    app/build.gradle android { useLibrary 'org.apache.http.legacy' }

    复制代码
    apply plugin: 'com.android.application'
    
    android {
        compileSdkVersion 28
        defaultConfig {
            applicationId "liudeli.async"
            minSdkVersion 21
            targetSdkVersion 28
            versionCode 1
            versionName "1.0"
            testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        }
        buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            }
        }
        useLibrary 'org.apache.http.legacy'
    }
    
    dependencies {
        implementation fileTree(dir: 'libs', include: ['*.jar'])
        implementation 'com.android.support:appcompat-v7:28.0.0'
        implementation 'com.android.support.constraint:constraint-layout:1.1.3'
        testImplementation 'junit:junit:4.12'
        androidTestImplementation 'com.android.support.test:runner:1.0.2'
        androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
    }
    复制代码

    在AndroidManifest.xml加入权限:

      <!-- 访问网络是危险的行为 所以需要权限 -->
        <uses-permission android:name="android.permission.INTERNET" />
    
        <!-- 设置壁纸是危险的行为 所以需要权限 -->
        <uses-permission android:name="android.permission.SET_WALLPAPER" />

    MainActivity6:

    package liudeli.async;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.Toast;
    
    import org.apache.http.HttpEntity;
    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.client.methods.HttpUriRequest;
    import org.apache.http.impl.client.DefaultHttpClient;
    import org.apache.http.message.BasicNameValuePair;
    
    import java.io.ByteArrayOutputStream;
    import java.io.InputStream;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    public class MainActivity6 extends Activity implements View.OnClickListener {
    
        private EditText etName;
        private EditText etPwd;
        private Button btLogin;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main6);
    
            etName = findViewById(R.id.et_name);
            etPwd = findViewById(R.id.et_pwd);
            btLogin = findViewById(R.id.bt_login);
    
            btLogin.setOnClickListener(this);
        }
    
        // 请求服务器的地址
        private final String PATH = "http://127.0.0.1:8080/LoginServlet";
    
        @Override
        public void onClick(View v) {
            // 拼装参数
            final Map<String, String> map = new HashMap<>();
            map.put("name", etName.getText().toString());
            map.put("pwd", etPwd.getText().toString());
    
            // 联网操作必须开启线程,执行异步任务
            new Thread(){
    
                @Override
                public void run() {
                    super.run();
    
                    try {
    
                        // Get请求方式,参数操作是拼接在链接
                        loginByGet(PATH, map);
    
                        // Post请求方式,参数操作是封装实体对象
                        loginByPost(PATH, map);
    
                    } catch (Exception e) {
                        e.printStackTrace();
                        threadRunToToast("登录是程序发生异常");
                    }
                }
    
            }.start();
        }
    
        /**
         * HttpClient Get 方式请求
         * @param path 请求的路径
         * @param map  请求的参数
         *                       拼接后的完整路径:http://127.0.0.1:8080/LoginServlet?name=zhangsan&pwd=123456
         */
        private void loginByGet(String path, Map<String, String> map) throws Exception{
            // 拼接路径 拼接后的完整路径:http://127.0.0.1:8080/LoginServlet?name=zhangsan&pwd=123456
            StringBuffer pathString = new StringBuffer(path);
            pathString.append("?");
            
            // 迭代遍历Map
            for (Map.Entry<String, String> mapItem : map.entrySet()) {
                String key = mapItem.getKey();
                String value = mapItem.getValue();
    
                // name=zhangsan&
                pathString.append(key).append("=").append(value).append("&");
            }
            // name=zhangsan&pwd=123456& 删除最后一个符号&  删除后:name=zhangsan&pwd=123456
            pathString.deleteCharAt(pathString.length() - 1);
            // 最后完整路径是:http://127.0.0.1:8080/LoginServlet?name=zhangsan&pwd=123456
    
            // 第一步 创建HttpClient
            HttpClient httpClient = new DefaultHttpClient();
    
            // 第三步 创建请求对象 Get
            HttpUriRequest getRequest = new HttpGet(pathString.toString());
    
            // 第二步 执行请求,获取响应对象
            HttpResponse response = httpClient.execute(getRequest);
    
            // 第四步 判断请求是否成功
            if (response.getStatusLine().getStatusCode() == 200) {
    
                // 第五步 获取响应的流
                InputStream inputStream = response.getEntity().getContent();
    
                byte[] bytes = new byte[1024];
                int len = 0;
                ByteArrayOutputStream bos = new ByteArrayOutputStream();
    
                while (-1 != (len = inputStream.read())) {
                    // 把存取到bytes的数据,写入到>>ByteArrayOutputStream
                    bos.write(bytes, 0, len);
                }
    
                // 第六步 判断是否请求成功, 注意:⚠️ success 是自定义服务器返回的  success代表登录成功
                String loginResult = bos.toString();
                if ("success".equals(loginResult)) {
    
                    // 不能子在子线程中Toast
                    // Toast.makeText(this, "登录成功", Toast.LENGTH_SHORT).show();
    
                    threadRunToToast("登录成功");
    
                } else {
                    // 不能子在子线程中Toast
                    // Toast.makeText(this, "登录失败", Toast.LENGTH_SHORT).show();
    
                    threadRunToToast("登录失败");
                }
    
                // 第七步 关闭流
                inputStream.close();
                bos.close();
    
            } else {
                // 不能子在子线程中Toast
                // Toast.makeText(this, "登录失败,请检查网络!", Toast.LENGTH_SHORT).show();
                threadRunToToast("登录失败,请检查网络!");
            }
        }
    
        /**
         * HttpClient Get 方式请求
         * @param path 请求的路径
         * @param map  请求的参数
         *                       路径:http://127.0.0.1:8080/LoginServlet
         *
         *                       参数:
         *                            name=zhangsan
         *                            pwd=123456
         */
        private void loginByPost(String path, Map<String, String> map) throws Exception {
    
            // 第一步 创建HttpClient
            HttpClient httpClient = new DefaultHttpClient();
    
            // 第三步 创建请求对象 Post
            HttpPost postRequest = new HttpPost(path);
    
            // 第六步 参数封装操作
            List<NameValuePair> nameValuePairs = new ArrayList<>();
            for (Map.Entry<String, String> mapItem : map.entrySet()) {
                // 遍历Map集合里面的 key value  >>>  name=zhangsan    pwd=123456
                String key = mapItem.getKey();
                String value = mapItem.getValue();
    
                // 创建参数对象
                NameValuePair nameValuePair = new BasicNameValuePair(key, value);
    
                // 把参数对象放入List<NameValuePair>集合
                nameValuePairs.add(nameValuePair);
            }
    
            // 第五步 创建实体对象 传入参数>>>List<? extends NameValuePair>
            HttpEntity entity = new UrlEncodedFormEntity(nameValuePairs, "UTF-8");
    
            // 第四步 把请求的参数 放入实体
            postRequest.setEntity(entity);
    
            // 第二步 执行请求,获取响应对象
            HttpResponse response = httpClient.execute(postRequest);
    
            // 第七步 判断请求是否成功
            if (response.getStatusLine().getStatusCode() == 200) {
    
                // 第八步 获取响应的流
                InputStream inputStream = response.getEntity().getContent();
    
                byte[] bytes = new byte[1024];
                int len = 0;
                ByteArrayOutputStream bos = new ByteArrayOutputStream();
    
                while (-1 != (len = inputStream.read())) {
                    // 把存取到bytes的数据,写入到>>ByteArrayOutputStream
                    bos.write(bytes, 0, len);
                }
    
                // 第九步 判断是否请求成功, 注意:⚠️ success 是自定义服务器返回的  success代表登录成功
                String loginResult = bos.toString();
                if ("success".equals(loginResult)) {
    
                    // 不能子在子线程中Toast
                    // Toast.makeText(this, "登录成功", Toast.LENGTH_SHORT).show();
    
                    threadRunToToast("登录成功");
    
                } else {
                    // 不能子在子线程中Toast
                    // Toast.makeText(this, "登录失败", Toast.LENGTH_SHORT).show();
    
                    threadRunToToast("登录失败");
                }
    
                // 第十步 关闭流
                inputStream.close();
                bos.close();
    
            } else {
                // 不能子在子线程中Toast
                // Toast.makeText(this, "登录失败,请检查网络!", Toast.LENGTH_SHORT).show();
                threadRunToToast("登录失败,请检查网络!");
            }
        }
    
        /**
         * 在 主线程 子线程 中提示,属于UI操作
         */
        private void threadRunToToast(final String text) {
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    Toast.makeText(getApplicationContext(), text, Toast.LENGTH_SHORT).show();
                }
            });
        }
    }

    activity_main6.xml :

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:padding="20dp">
    
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="姓名"
                />
    
            <EditText
                android:id="@+id/et_name"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                />
    
        </LinearLayout>
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:padding="20dp">
    
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="密码"
                />
    
            <EditText
                android:id="@+id/et_pwd"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                />
    
        </LinearLayout>
    
        <Button
            android:id="@+id/bt_login"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="20dp"
            android:layout_marginRight="20dp"
            android:layout_marginTop="20dp"
            android:text="login"
            />
    
    </LinearLayout>

  • 相关阅读:
    跨域访问方法列举 jsonp 和 客户端
    session 垃圾回收机制
    php 根据数据权重,得分或者持有数量等进行均衡分配给定数量分配方法
    进程和线程比较
    redis 过期策略分析
    redis 基础知识详解
    tcp/ip 协议
    ip 协议详解
    php redis 分布式类
    nginx打开目录游览功能
  • 原文地址:https://www.cnblogs.com/android-deli/p/10247510.html
Copyright © 2020-2023  润新知