1.模仿登入页面显示(使用传统方式是面向过程的)

使用Apache公司提供的HttpClient  API是面向对象的

(文章底部含有源码的连接,包括了使用async框架)

(解决中文乱码的问题。主要是对中文的数据进行URL编码)

android手机默认的编码是UTF-8

2.手机截图Demo

3.server截图

代码例如以下:

server端的代码:

//測试 android设备登入
public class Login extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { String username = request.getParameter("username");
String password = request.getParameter("password"); //对数据进行编码,解决乱码问题
username = new String(username.getBytes("ISO-8859-1"),"UTF-8");
System.out.println("username--:"+username+"---password:"+password); if(username.equals("admin") && password.equals("123")){
response.getOutputStream().write("登入成功".getBytes("UTF-8"));
}else{
response.getOutputStream().write("登入失败".getBytes("UTF-8"));
}
} public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// request.setCharacterEncoding("UTF-8");
doGet(request, response); } }

Androidclient

布局文件的部分:

//測试 android设备登入
public class Login extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { String username = request.getParameter("username");
String password = request.getParameter("password"); //对数据进行编码,解决乱码问题
username = new String(username.getBytes("ISO-8859-1"),"UTF-8");
System.out.println("username--:"+username+"---password:"+password); if(username.equals("admin") && password.equals("123")){
response.getOutputStream().write("登入成功".getBytes("UTF-8"));
}else{
response.getOutputStream().write("登入失败".getBytes("UTF-8"));
}
} public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// request.setCharacterEncoding("UTF-8");
doGet(request, response); } }

Activity代码部分:

(注意:android4.0之后訪问网络必须开子线程进行訪问,而且涉及到权限。记得加上訪问网络的权限

以下的代码中,我写入get和post两种方式的线程请求。。

。。。。。

。。。

。。。慢慢体会

public class MainActivity extends AppCompatActivity {
private static final int SUCCESS = 0;
private static final int FAILE = 1;
private static final int NET_ERROR = 3;
private static final String TAG = "MainActivity";
EditText et_username;
EditText et_password;
TextView show_result;
String username;
String password; final String path = "http://188.188.7.85/Android_Server/Login"; Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
int what = msg.what; switch (what) {
case SUCCESS:
String data = (String) msg.obj;
show_result.setText(data);
break;
case FAILE:
Toast.makeText(MainActivity.this, "连接server失败", Toast.LENGTH_SHORT).show();
break;
case NET_ERROR:
Toast.makeText(MainActivity.this, "网络出现异常", Toast.LENGTH_SHORT).show();
break;
default:
break;
}
}
}; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et_username = (EditText) findViewById(R.id.et_username);
et_password = (EditText) findViewById(R.id.et_password);
show_result = (TextView) findViewById(R.id.show_result); username = et_username.getText().toString().trim();
password = et_password.getText().toString().trim();
} public void login(View view) {
username = et_username.getText().toString().trim();
password = et_password.getText().toString().trim(); if (TextUtils.isEmpty(username) || TextUtils.isEmpty(password)) {
Toast.makeText(this, "username与password不能为空", Toast.LENGTH_SHORT).show();
return;
} //使用传统get方式的请求server
// new Thread_get().start(); //使用传统的post方式请求server
new Thread_post().start(); } //传统的post方式请求server端
class Thread_post extends Thread {
@Override
public void run() {
try {
URL url = new URL(path);
HttpURLConnection conn = (HttpURLConnection) url.openConnection(); //1.设置请求方式
conn.setRequestMethod("POST");
conn.setConnectTimeout(5000); //设置连接的超时事件是5秒 //2.组合数据,一定要将数据进行URL编码
String commitData = "username="+URLEncoder.encode(username,"UTF-8")+"&password="+URLEncoder.encode(password,"UTF-8"); // 3. 指定content-type -实际上就是指定传输的数据类型
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); //4.指定content-length Content-Length: 数据的长度
conn.setRequestProperty("Content-Length", commitData.length() + ""); //5.打开输出流。告诉server,我要写数据了
conn.setDoOutput(true); //6.開始写数据
OutputStream os = conn.getOutputStream();
os.write(commitData.getBytes());
// os.close(); int code = conn.getResponseCode(); //获取返回的成功代码
Log.i(TAG, "code:---" + code); if (code == 200) {
//表示连接server成功返回信息
String data = ServerTools.getInfo(conn.getInputStream()); Log.i(TAG, "data:---" + data);
//使用消息处理机制,将数据传递给主线程
Message ms = new Message();
ms.what = SUCCESS;
ms.obj = data;
handler.sendMessage(ms);
} else {
//使用消息处理机制,将数据传递给主线程
Message ms = new Message();
ms.what = FAILE;
handler.sendMessage(ms);
} } catch (Exception e) { //使用消息处理机制,将数据传递给主线程
Message ms = new Message();
ms.what = NET_ERROR;
handler.sendMessage(ms);
e.printStackTrace();
}
}
} //传统的get方式请求server端
class Thread_get extends Thread {
@Override
public void run() {
try {
String getPath = path +
"?username=" + URLEncoder.encode(username, "UTF-8") +
"&password=" + URLEncoder.encode(password, "UTF-8");
URL url = new URL(getPath);
HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("GET");
conn.setConnectTimeout(5000); //设置连接的超时事件是5秒
int code = conn.getResponseCode(); //获取返回的成功代码 Log.i(TAG, "code:---" + code);
; if (code == 200) {
//表示连接server成功返回信息
String data = ServerTools.getInfo(conn.getInputStream()); Log.i(TAG, "data:---" + data);
//使用消息处理机制,将数据传递给主线程
Message ms = new Message();
ms.what = SUCCESS;
ms.obj = data;
handler.sendMessage(ms);
} else {
//使用消息处理机制,将数据传递给主线程
Message ms = new Message();
ms.what = FAILE;
handler.sendMessage(ms);
} } catch (Exception e) { //使用消息处理机制,将数据传递给主线程
Message ms = new Message();
ms.what = NET_ERROR;
handler.sendMessage(ms);
e.printStackTrace();
}
}
} }

工具类:

public class ServerTools {

    //从服务端获取流数据进行转化成文本文件
public static String getInfo(InputStream in) { //将数据流写在内存中
ByteArrayOutputStream raf = new ByteArrayOutputStream();
String data = null; try{
byte[] bt = new byte[1024];
int len =0 ;
while((len = in.read(bt)) != -1){
raf.write(bt,0,len);
} data = raf.toString();
}catch (Exception e){
e.printStackTrace();
} return data;
}
}

Android的源码已经放在github中:

传统方式Demo地址:https://github.com/momxmo/HTTP_get_post

Apache提供的HttpClient API面向对象的方式Demo:https://github.com/momxmo/HttpClient_get_post

使用async-http-master流行框架进行http请求:https://github.com/momxmo/Http_android-async-http-master_Demo




Android传统HTTP请求get----post方式提交数据(包括乱码问题)的更多相关文章

  1. Android HttpClient框架get和post方式提交数据(非原创)

    1.fragment_main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android& ...

  2. Android 采用post方式提交数据到服务器

    接着上篇<Android 采用get方式提交数据到服务器>,本文来实现采用post方式提交数据到服务器 首先对比一下get方式和post方式: 修改布局: <LinearLayout ...

  3. Android(java)学习笔记213:开源框架post和get方式提交数据(qq登录案例)

    1.前面提到Http的get/post方式  . HttpClient方式,实际工作的时候不常用到,因为这些方式编写代码是很麻烦的 2.Android应用会经常使用http协议进行传输,网上会有很完善 ...

  4. Android 使用Post方式提交数据(登录)

    在Android中,提供了标准Java接口HttpURLConnection和Apache接口HttpClient,为客户端HTTP编程提供了丰富的支持. 在HTTP通信中使用最多的就是GET和POS ...

  5. Android 使用Post方式提交数据

    在Android中,提供了标准Java接口HttpURLConnection和Apache接口HttpClient,为客户端HTTP编程提供了丰富的支持. 在HTTP通信中使用最多的就是GET和POS ...

  6. Android(java)学习笔记156:开源框架post和get方式提交数据(qq登录案例)

    1. 前面提到Http的get/post方式  . HttpClient方式,实际工作的时候不常用到,因为这些方式编写代码是很麻烦的 2. Android应用会经常使用http协议进行传输,网上会有很 ...

  7. Android学习之Http使用Post方式进行数据提交(普通数据和Json数据)

    转自:http://blog.csdn.net/wulianghuan/article/details/8626551 我们知道通过Get方式提交的数据是作为Url地址的一部分进行提交,而且对字节数的 ...

  8. 苹果微信浏览器不能post方式提交数据问题

    form表单中采用post方式提交数据时,在苹果的微信浏览器中无法传递,安卓的可以 如图: 在controller中获取该数据为 null 将表单的提交方式修改为get就能够获取到 现在采用Ajax方 ...

  9. postman 中post方式提交数据

    post方式提交数据时,把参数填写在body中而不是pOST下面的哪一行

随机推荐

  1. leetcode排列组合相关

    目录 78/90子集 39/40组合总和 77组合 46/47全排序,同颜色球不相邻的排序方法 78/90子集 输入: [1,2,2] 78输出: [[], [1], [2], [1 2], [2], ...

  2. selenium3+python-多窗口、句柄(handle)

    一.获取当前窗口句柄 1.元素有属性,浏览器的窗口其实也有属性的,只是你看不到,浏览器窗口的属性用句柄(handle)来识别. 2.人为操作的话,可以通过眼睛看,识别不同的窗口点击切换.但是脚本没长眼 ...

  3. ride关键字

    定义变量:set variable 打印 :log 列表:create list 字符转数字型:evaluate 随机数:evaluate random.randint 日志截图:先导入screens ...

  4. 搭建go开发环境

    一.go下载安装 进入该网站 https://golang.google.cn/dl/  选择相应的操作系统下载安装包 Linux/Mac OS X 安装 1.下载 go1.10.3.linux-am ...

  5. ROS-URDF-物理属性

    前言:介绍向连杆添加碰撞和惯性属性,以及向关节添加动力学. 参考自:http://wiki.ros.org/urdf/Tutorials/Adding%20Physical%20and%20Colli ...

  6. MVVM实现ViewModel获取View输入验证状态

    由于Binding只把Convert成功的值送往Source,当目标中的值Convert失败时Source的值依然是旧值,所以ViewModel必须获取View的输入验证状态,以下是本人的实现. 当“ ...

  7. Asp.net MVC访问框架页中嵌套的iframe页面时,如果session或cookie过期,登录验证超时怎样自动跳转到登录页

    一般登录验证的过滤器中,使用验证过滤器的Redirect方法,将请求重定向到指定的URL.但是如果我们要访问的页面是一个嵌套在框架页中的iframe页面时,这种重定向只会对iframe页面凑效,也就是 ...

  8. border使用

    border属性 border-width  border-style  border-color  inherit border-style的值:none  dotted(点线)  dashed(虚 ...

  9. Java基础学习(二)——对象

    类:是抽象的概念集合,表示的是一个共性的产物,类之中定义的是属性和行为(方法): 对象:对象是一种个性的表示,表示一个独立的个体,每个对象拥有自己独立的属性,依靠属性来区分不同对象. 对象=实例 对象 ...

  10. Android截图截取弹框AlertDialog

    1:效果如图 2:权限 <uses-sdk android:minSdkVersion="21" android:targetSdkVersion="21" ...