zoukankan      html  css  js  c++  java
  • android 之HttpURLConnection的post,get方式请求数据

    get方式和post方式的区别:

    1.请求的URL地址不同:
      post:"http://xx:8081//servlet/LoginServlet"
      get:http://xxx:8081//servlet/LoginServlet?username=root&pwd=123

    2.请求头不同:
      ****post方式多了几个请求头:Content-Length   ,   Cache-Control , Origin

        openConnection.setRequestProperty("Content-Length", body.length()+"");
        openConnection.setRequestProperty("Cache-Control", "max-age=0");
        openConnection.setRequestProperty("Origin", "http://xx:8081");

      ****post方式还多了请求的内容:username=root&pwd=123

        //设置UrlConnection可以写请求的内容
        openConnection.setDoOutput(true);
        //获取一个outputstream,并将内容写入该流
        openConnection.getOutputStream().write(body.getBytes());

    3.请求时携带的内容大小不同
      get:1k
      post:理论无限制

    登录的布局文件

    <?xml version="1.0" encoding="utf-8"?>
    <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="com.example.yb.myapplication.MainActivity">
    
        <EditText
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:id="@+id/input_username"
            android:hint="@string/input_username"/>
    
        <EditText
            android:layout_marginTop="10dp"
            android:layout_marginBottom="10dp"
            android:inputType="textPassword"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:id="@+id/input_password"
            android:hint="@string/input_password"/>
    
        <RelativeLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content">
            <CheckBox
                android:layout_marginLeft="30dp"
                android:layout_centerVertical="true"
                android:layout_alignParentLeft="true"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:id="@+id/cb_rem"
                android:text="@string/reme_password"/>
    
            <Button
                android:layout_marginRight="30dp"
                android:paddingLeft="10dp"
                android:paddingRight="10dp"
                android:layout_alignParentRight="true"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:id="@+id/bt_login"
                android:text="@string/bt_login"/>
        </RelativeLayout>
    </LinearLayout>

    登录的Activity代码

    public class GetPostActivity extends AppCompatActivity {
        private EditText et_username;
        private EditText et_password;
        private CheckBox cb_rem;
        private Button bt_login;
        private Context mcontext;
        private String username;
        private String password;
        private boolean isRem;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_get_post);
    
            et_username = (EditText) findViewById(R.id.input_username);
            et_password = (EditText) findViewById(R.id.input_password);
            cb_rem = (CheckBox) findViewById(R.id.cb_rem);
            bt_login = (Button) findViewById(R.id.bt_login);
            bt_login.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    login();
                }
            });
        }
    
        //创建一个handler
        Handler handler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                boolean isloginsuccess = (boolean) msg.obj;
    
                if (isloginsuccess) {
                    //判断是否记住密码,要保存到本地,封装成方法
                    if (isRem) {
                        //保存用户名和密码
                        boolean result = UserInfoUtil.saveUserInfo(mcontext, username, password);
                        if (result) {
                            Toast.makeText(getApplicationContext(), "用户名和密码保存成功", Toast.LENGTH_SHORT).show();
                        } else {
                            Toast.makeText(getApplicationContext(), "用户名和密码保存失败", Toast.LENGTH_SHORT).show();
                        }
                    } else {
                        Toast.makeText(getApplicationContext(), "登录成功", Toast.LENGTH_SHORT).show();
                    }
                } else {
                    Toast.makeText(getApplicationContext(), "登录失败", Toast.LENGTH_SHORT).show();
                }
            }
        };
    
        public void login() {
            username = et_username.getText().toString().trim();
            password = et_password.getText().toString().trim();
            isRem = cb_rem.isChecked();
            //判断是否密码或者用户名为空
            if (TextUtils.isEmpty(username) || TextUtils.isEmpty(password)) {
                Toast.makeText(this, "用户名和密码不能为空", Toast.LENGTH_SHORT).show();
                return;
            }
    
            //post方法登录是否成功
            LoginHttpUtil.requestNetForGetLogin(handler, username, password);
        }
    }

    新建一个Net包,处理网络请求的操作,新建一个loginhttputil.java

    public class LoginHttpUtil {
    //get方式登录
    public static void requestNetForGetLogin(final Handler handler,final String username,final String password) {

    //在子线程中操作网络请求
    new Thread(new Runnable() {
    @Override
    public void run() {
    //urlConnection请求服务器,验证
    try {
    //1:url对象
    URL url = new URL("http://192.168.1.100:8081//servlet/LoginServlet?username=" + URLEncoder.encode(username)+ "&pwd=" + URLEncoder.encode(password) + "");
    //2;url.openconnection
    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
    //3
    conn.setRequestMethod("GET");
    conn.setConnectTimeout(10 * 1000);
    //4
    int code = conn.getResponseCode();
    if (code == 200) {
    InputStream inputStream = conn.getInputStream();
    String result = StreamUtil.stremToString(inputStream);
    System.out.println("=====================服务器返回的信息::" + result);
    boolean isLoginsuccess=false;
    if (result.contains("success")) {
    isLoginsuccess=true;
    }
    Message msg = Message.obtain();
    msg.obj=isLoginsuccess;
    handler.sendMessage(msg);
    }
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    }).start();
    }

    //post方式登录
    public static void requestNetForPOSTLogin(final Handler handler,final String username,final String password) {
    new Thread(new Runnable() {
    @Override
    public void run() {
    //urlConnection请求服务器,验证
    try {
    //1:url对象
    URL url = new URL("http://192.168.1.100:8081//servlet/LoginServlet");

    //2;url.openconnection
    HttpURLConnection conn = (HttpURLConnection) url.openConnection();

    //3设置请求参数
    conn.setRequestMethod("POST");
    conn.setConnectTimeout(10 * 1000);
    //请求头的信息
    String body = "username=" + URLEncoder.encode(username) + "&pwd=" + URLEncoder.encode(password);
    conn.setRequestProperty("Content-Length", String.valueOf(body.length()));
    conn.setRequestProperty("Cache-Control", "max-age=0");
    conn.setRequestProperty("Origin", "http://192.168.1.100:8081");

    //设置conn可以写请求的内容
    conn.setDoOutput(true);
    conn.getOutputStream().write(body.getBytes());

    //4响应码
    int code = conn.getResponseCode();
    if (code == 200) {
    InputStream inputStream = conn.getInputStream();
    String result = StreamUtil.stremToString(inputStream);
    System.out.println("=====================服务器返回的信息::" + result);
    boolean isLoginsuccess=false;
    if (result.contains("success")) {
    isLoginsuccess=true;
    }
    Message msg = Message.obtain();
    msg.obj=isLoginsuccess;
    handler.sendMessage(msg);
    }
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    }).start();
    }
    }

    二:get方式提交数据时候出现乱码的情况l;解决办法如下:

      一般在开发客户端和服务端的编码要保持一致。

        android端的默认编码是utf-8;

        做url请求时需要对参数进行URLEncode编码.

        URL url = new URL("http://xx:8081/servlet/LoginServlet?username="+URLEncoder.encode(username)+"&pwd="+URLEncoder.encode(password))

    # 2.   post方式提交数据乱码解决
      

      String body = "username=" + URLEncoder.encode(username) + "&pwd=" + URLEncoder.encode(password);
  • 相关阅读:
    asp.net mvc 下载文件 txt doc xsl 等等
    MySQL用户管理:添加用户、授权、删除用户、删除用户、修改用户密码
    Vue打包时Unknown plugin "external-helpers" in "xxx\.babelrc" at 0" 解决方案
    vue中Axios的封装
    Docker部署ASP.NET Core应用到Linux中bash脚本
    Linux CentOS7系统中安装Nodejs、cnpm、Git环境
    C#之获取PDF张数以及PDF转JPG
    C#Amr转MP3
    mysql 之C#使用insert批量插入时日期字段为null,插入报错解决方案
    Windows服务器共享文件,Linux服务器实现挂载共享文件
  • 原文地址:https://www.cnblogs.com/DonAndy/p/6195752.html
Copyright © 2011-2022 走看看