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. bzoj2120 数颜色——带修莫队

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2120 带修改的莫队: 用结构体存下修改和询问,排好序保证时间后就全局移动修改即可: 参考了T ...

  2. (Go)09.指针赋值修改示例

      答案: 1 package main 2 import ( 3 "fmt" 4 ) 5 6 7 func modify(p *int) { 8 fmt.Println(p) 9 ...

  3. 捣鼓TinyMCE粘贴图片并上传+Flask后台

    好久没有编程了,最近需要完成一个小功能,为了方便,需要粘贴图片后上传到后台.前台编辑器用tinymce(N年前用过,我也就知道这个编辑器而已.这次使用下来感觉文档更丰富了),后台我用的Flask.昨天 ...

  4. A. Jeff and Digits(cf)

    A. Jeff and Digits time limit per test 1 second memory limit per test 256 megabytes input standard i ...

  5. 【区间DP】释放囚犯

    貌似和石子合并差不多 可能是我见的题太少了,所以都差不多 OK 算法分析 首先不难看出这是一道区间DP,那么,按照本蒟蒻的意思 区间DP==三个循环 for(int len=2;len<=n;l ...

  6. [CodeForces522B] Photo to Remember

    某一天,n个朋友在一起聚会,他们已经很久没见了,于是他们决定拍照留念. 简单的说,拍照的时候,每个人有一个高度和宽度,第i个的高度和宽度分别是hi和wi.这些人排成一条直线,照片的最小的面积必须包含所 ...

  7. Oracle快速收集AWR的方案

    记一种方便的awr收集方法,该脚本可以按小时收集目标时段的awr 素材:awr_generate.sql(具体脚本内容请见本文末尾) (1)将awr_generate.sql置于数据库服务器本地路径, ...

  8. css样式变 及实际用法

    <html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Con ...

  9. java编程基础篇-------> 从键盘输入一位整数,代表月份,编程判断指定月份属于一年中的哪个季度。如果是 12 月、1 月、2 月,就属于冬季。

    从键盘输入一位整数,代表月份,编程判断指定月份属于一年中的哪个季度.如果是 12月.1 月.2 月,就属于冬季:如果是 3 月.4 月.5 月,就属于春季:如果是 6 月.7 月.8 月,就属于夏季: ...

  10. 安装Oracle客户端时,检查系统要求时状态为错误的解决办法

    这是我自己安装oracle11g至win7的错误记录: 正在检查操作系统要求... 要求的结果: 5.0,5.1,5.2,6.0 之一 实际结果: 6.1 我换了 10g,11g从32bit到64bi ...