Android-HttpURLConnection-Get与Post请求登录功能
HttpURLConnection 在这请求方式是Java包中的;
AndroidManifest.xml配置权限:
<!-- 访问网络是危险的行为 所以需要权限 -->
<uses-permission android:name="android.permission.INTERNET" /> <!-- 设置壁纸是危险的行为 所以需要权限 -->
<uses-permission android:name="android.permission.SET_WALLPAPER" />
MainActivity7.java :
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 java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map; public class MainActivity7 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_main7); 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();
} /**
* HttpURLConnection 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 // 第一步 包装网络地址
URL url = new URL(pathString.toString()); // 第二步 打开连接对象
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection(); // 第三步 设置连接超时时长
httpURLConnection.setConnectTimeout(5000); // 第四步 设置请求方式Get
httpURLConnection.setRequestMethod("GET"); // 第五步 发生请求 ⚠注意:只有在>>httpURLConnection.getResponseCode(); 才向服务器发请求
int responseCode = httpURLConnection.getResponseCode(); // 第六步 判断请求码是否成功
// 注意⚠️:只有在执行conn.getResponseCode() 的时候才开始向服务器发送请求
if(responseCode == HttpURLConnection.HTTP_OK) { // 第七步 获取服务器响应的流
InputStream inputStream = httpURLConnection.getInputStream(); 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("登录失败,请检查网络!");
}
} /**
* HttpURLConnection Get 方式请求
* @param path 请求的路径
* @param params 请求的参数
* 路径:http://127.0.0.1:8080/LoginServlet
*
* 参数:
* name=zhangsan
* pwd=123456
*/
private void loginByPost(String path, Map<String, String> params) throws Exception { // ------------------------------------------------ 以下是实体拼接帮助 /**
* 拼实体 注意⚠️:是需要服务器怎么配置 这里就要怎么拼接 例如:user.name=zhangsan&user.pwd=123
* 注意:⚠ 这不是访问服务器的地址,这是拼接实体
*/
StringBuilder paramsString = new StringBuilder();
for(Map.Entry<String, String> entry: params.entrySet()){
paramsString.append(entry.getKey());
paramsString.append("=");
paramsString.append(URLEncoder.encode(entry.getValue(), "UTF-8"));
paramsString.append("&");
}
/**
* user.name=zhangsan&user.pwd=123& 删除最后一个符号& 删除后:user.name=zhangsan&user.pwd=123
* 注意:⚠ 这不是访问服务器的地址,这是拼接实体
*/
paramsString.deleteCharAt(paramsString.length() - 1); // 理解为实体
byte[] entity = paramsString.toString().getBytes(); // ------------------------------------------------ 以下是 HttpURLConnection Post 访问 代码 // 第一步 包装网络地址
URL url = new URL(path); // 第二步 打开连接对象
HttpURLConnection conn = (HttpURLConnection) url.openConnection(); // 第三步 设置连接超时时长
conn.setConnectTimeout(5000); // 第四步 设置请求方式 POST
conn.setRequestMethod("POST"); /**
* 第五步 设置请求参数
* 请求参数类型
*/
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
// 请求实体的长度(字节)
conn.setRequestProperty("Content-Length", entity.length+""); // 第六步 允许对外输出
conn.setDoOutput(true); // 第七步 得到输出流 并把实体输出写出去
OutputStream os = conn.getOutputStream();
os.write(entity); // 注意⚠️:只有在执行conn.getResponseCode() 的时候才开始向服务器发送请求
if(conn.getResponseCode() == HttpURLConnection.HTTP_OK){ // 第八步 获取服务器响应的流
InputStream inputStream = conn.getInputStream(); 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();
}
} /**
* 在 主线程 子线程 中提示,属于UI操作
*/
private void threadRunToToast(final String text) {
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(), text, Toast.LENGTH_SHORT).show();
}
});
}
}
activity_main7.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>

Android-HttpURLConnection-Get与Post请求登录功能的更多相关文章
- Android+struts2+json方式模拟手机登录功能
涉及到的知识点: 1.Struts2框架的搭建(包括Struts2的jSON插件) 2.Android前台访问Web采用HttpClient方式. 3.Android采用JSON的解析. 服务端主要包 ...
- Android-HttpClient-Get与Post请求登录功能
HttpClient 是org.apache.http.* 包中的: 第一种方式使用httpclient-*.jar (需要在网上去下载httpclient-*.jar包) 把httpclient-4 ...
- Android学习笔记_65_登录功能本身没有任何特别
对于登录功能本身没有任何特别,使用httpclient向服务器post用户名密码即可.但是为了保持登录的状态(在各个Activity之间切换时要让网站知道用户一直是处于登录的状态)就需要进行cooki ...
- 为Android游戏接入第三方登录功能
1. “游戏客户端”调用“SDK客户端”的登录功能向“SDK服务端”进行身份认证 2. 验证通过后,“游戏客户端”可得到用户信息,根据游戏逻辑可将用户信息传给“游戏服务器”进行验证 3. “游戏服务器 ...
- android网络编程之HttpUrlConnection的讲解--POST请求
1.服务器后台使用Servlet开发,这里不再介绍. 2.网络开发不要忘记在配置文件中添加访问网络的权限 <uses-permission android:name="android. ...
- android网络编程之HttpUrlConnection的讲解--GET请求
1.服务器后台使用Servlet开发,这里不再介绍. 2.测试机通过局域网链接到服务器上,可以参考我的博客:http://www.cnblogs.com/begin1949/p/4905192.htm ...
- android使用smack实现简单登录功能
android端采用xmpp协议实现即时通讯,在最开始的登录功能就遇到了不少障碍.首先在官网(https://www.igniterealtime.org/projects/openfire/)下载o ...
- Android Studio 通过一个登录功能介绍SQLite数据库的使用
前言: SQLite简介:是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中.它是D.RichardHipp建立的公有领域项目.它的设计目标是嵌入式的,而且目前已经在 ...
- (22)Ajax的基本使用(实现登录功能和局部刷新以及防止跨站请求伪造攻击)
Ajax的作用 前后端分离的项目,需要交互,就要通过Ajax来完成交互 AJAX(Asynchronous Javascript And XML)翻译成中文就是“异步Javascript和XML”.即 ...
随机推荐
- virualbox问题
出不来64位虚拟系统 bios设置虚拟化可用 2.创建虚拟机 启动不了 提示 不能打开一个... 安装exten 扩张包 3.设备 -- 安装增强功能... 分辨率 设置成功
- Python学习1 基础数据类型
一.字符串 1.去除首尾字符 str_test = 'Hello World!' str_test.split()#将字符串分割为列表str_test. ...
- .NET TCP协议之TcpClient与TcpListener交互
问题:手机某项功能服务需要采用TCP协议与第三方交互通信.需先在公司内部测试此功能. 原因:第三方没有任何消息返回,也没有客服提供服务. 解决方法:公司内部做一个TCP协议服务器端,根据外网ip+端口 ...
- [Office]Execl取消保护密码
2007版Excel表格中可以按照以下方式建宏: 打开Excel表格中的Excel选项,选择自定义,得到如下画面: 然后在左边侧框栏中选择“查看宏”或者Alt+F11 之后双击或者选择添加按钮,则可 ...
- mybatis学习 十 动态 SQL
1. 根据方法传入的参数不同执行不同的 SQL 命令.称为动态 SQL, MyBatis 中动态 SQL 就是在 mapper.xml 中添加逻辑判断等. 2. <if>标签 <s ...
- dfs序理解-hdu3887
dfs序就是相当于把树转化成了一个区间,在区间上进行操作. void dfs(int u, int fa) { l[u]=++key; ; i=e[i].next) { int v=e[i].v; i ...
- kbmmw 的远程桌面功能2-android手机端
前面讲了PC 端的远程操作,今天讲一下如何用手机控制远程桌面(真的能操作的很爽吗?), 要使手机可以远程控制,首先在在kbmmwconfig.inc 文件里面加入FMX 支持 {$DEFINE KBM ...
- CHAPITRE II
J'ai ainsi vécu seul, sans personne avec qui parler véritablement, jusqu'à une panne[pan][机]故障 dans ...
- ACM-ICPC 2018 徐州赛区网络预赛 C Cacti Lottery(暴力+期望)
链接https://nanti.jisuanke.com/t/31455 思路 首先先枚举把剩下的数填入星号的情况(其实就是枚举星号的排列),这是对方所能知道的所有信息,然后对方将取八种决策中最优的情 ...
- shell 常见面试
1.求100以内的质数 #!/bin/bash n= ;i<=n;i++)) do ;x<=i;x++)) do b=$(( $i%$x )) ]]; then a=$a+ fi done ...