本文主要对 Android 中三种 POST 和 GET 的提交方式进行详细介绍。通过任何一种方式可以实现的功能是,从安卓手机端提交数据到服务器端,服务器端进行判断,并返回相应的结果。三种方式各有利弊,实现效果相同,在实际的使用过程中可以根据本身的需要进行选择。
Android 是一种基于 Linux 的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由 Google 公司和开放手机联盟领导及开发。尚未有统一中文名称,中国大陆地区较多人使用 "安卓" 或 "安致"。
向服务器提交数据有两种方式,post 和 get。两者的区别主要有三点,安全性、长度限制、数据结构。其中 get 请求安全性相比较而言较差,数据长度受浏览器地址栏限制,没有方法体。两种都是较为重要的数据提交方式。现简单介绍一下三种 post 和 get 的提交方式。无论是哪种方法实现 post 和 get,get 的访问路径都要携带数据,而 post 提交是把数据放在方法体中。
普通方法实现 get/post 提交:
严格遵照 Http 协议进行数据传输。在安卓开发环境下,由于主线程不能进行网络访问,因此需要在开启一个子线程向服务器提交数据。为了更加直观的观察数据,可以在程序屏幕上显示服务器反馈信息。又由于子线程无法更改 UI 界面,因此需要引入 Hnndler 代理器。实现 get/post 提交基本步骤就是,获取 URL 路径,根据路径得到 Http 连接,用 HttpURLConnection 对象设置相关的 http 配置信息、提交方式以及获取反馈码。当响应码为 200 时表示提交成功,可以通过 HttpURLConnection 以流的形式获取反馈信息。
普通 GRT 提交方式:
- public void load(View view){
- final String qq = et_qq.getText().toString().trim();
- final String pwd = et_pwd.getText().toString().trim();
- if (TextUtils.isEmpty(qq) || TextUtils.isEmpty(pwd)) {
- Toast.makeText(MainActivity.this, "qq号或密码为空", 0).show();
- return;
- }
- final String path = "http://192.168.1.114:8080/qqload/qqload?qq=" + qq
- + "&pwd=" + pwd;
- new Thread() {
- public void run() {
- try {
- URL url = new URL(path);
- HttpURLConnection conn = (HttpURLConnection) url
- .openConnection();
- conn.setRequestMethod("GET");
- conn.setReadTimeout(5000);
- int code = conn.getResponseCode();
- if (code == 200) {
- InputStream is = conn.getInputStream();
- String result = StreamTools.ReadStream(is);
- Message msg = Message.obtain();
- msg.what = SUCCESS;
- msg.obj = result;
- handler.sendMessage(msg);
- } else {
- Message msg = Message.obtain();
- msg.what = ERROR1;
- handler.sendMessage(msg);
- }
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- Message msg = Message.obtain();
- msg.what = ERROR2;
- handler.sendMessage(msg);
- }
- }
- }.start();
- }
普通 POST 提交方式:
- public void load(View view){
- final String qq = et_qq.getText().toString().trim();
- final String pwd = et_pwd.getText().toString().trim();
- if (TextUtils.isEmpty(qq) || TextUtils.isEmpty(pwd)) {
- Toast.makeText(MainActivity.this, "qq号或密码为空", 0).show();
- return;
- }
- final String path = "http://192.168.1.114:8080/qqload/qqload";
- new Thread() {
- public void run() {
- try {
- URL url = new URL(path);
- HttpURLConnection conn = (HttpURLConnection) url
- .openConnection();
- conn.setRequestMethod("POST");
- conn.setReadTimeout(5000);
- conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
- String data = "qq="+URLEncoder.encode(qq,"utf-8")+"&pwd=" + URLEncoder.encode(pwd,"utf-8");
- conn.setRequestProperty("Content-Length",String.valueOf(data.length()));
- conn.setDoOutput(true);
- conn.getOutputStream().write(data.getBytes());
- int code = conn.getResponseCode();
- if (code == 200) {
- InputStream is = conn.getInputStream();
- String result = StreamTools.ReadStream(is);
- Message msg = Message.obtain();
- msg.what = SUCCESS;
- msg.obj = result;
- handler.sendMessage(msg);
- } else {
- Message msg = Message.obtain();
- msg.what = ERROR1;
- handler.sendMessage(msg);
- }
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- Message msg = Message.obtain();
- msg.what = ERROR2;
- handler.sendMessage(msg);
- }
- }
- }.start();
- }
用 httpclien 实现 get/post 提交的只需要一下几个步骤:
1. 创建 HttpClient 对象,实现打开浏览器的功能
- HttpClient client = new DefaultHttpClient();
2. 输入地址或者数据 ,用到 HttpGet() 或 HttpPost(), 传入要访问的路径,得到 HttpGet 或 HttpPost 对象。
- HttpGet httpGet = new HttpGet(path);
3. 把获得的 HttpGet 或 HttpPost 对象发送到服务器,实现敲回车的功能,得到 HttpResponse 对象。
- HttpResponse response = client.execute(httpGet);
4. 得到 HttpResponse 对象获取状态行中的状态码,判断状态码状态码。
- int code = response.getStatusLine().getStatusCode();
5. 同样用 HttpResponse 对象获取相应内容,存入流对象。最后将得到的流对象转为字符串进行显示。
- InputStream is = response.getEntity().getContent();
其中要注意的一点是用 post 请求时要传递值所以要多出一个步骤。具体而言,先创建一个 list 集合,集合的泛型用 NameValuePair 表示,类似于键值对的形式存储要传递的数据。接着向集合中添加要提交数据。最后用 HttpPost 对象把集合存入请求体中。
用 HttpClient 实现 GET 提交:
- public void load(View view){
- final String qq = et_qq.getText().toString().trim();
- final String pwd = et_pwd.getText().toString().trim();
- if (TextUtils.isEmpty(qq) || TextUtils.isEmpty(pwd)) {
- Toast.makeText(MainActivity.this, "qq号或密码为空", 0).show();
- return;
- }
- final String path = "http://192.168.1.114:8080/qqload/qqload?qq=" + qq
- + "&pwd=" + pwd;
- new Thread() {
- public void run() {
- try {
- HttpClient client = new DefaultHttpClient();
- HttpGet httpget = new HttpGet(path);
- HttpResponse response = client.execute(httpget);
- int code = response.getStatusLine().getStatusCode();
- if (code == 200) {
- InputStream is = response.getEntity().getContent();
- String result = StreamTools.ReadStream(is);
- Message msg = Message.obtain();
- msg.what = SUCCESS;
- msg.obj = result;
- handler.sendMessage(msg);
- } else {
- Message msg = Message.obtain();
- msg.what = ERROR1;
- handler.sendMessage(msg);
- }
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- Message msg = Message.obtain();
- msg.what = ERROR2;
- handler.sendMessage(msg);
- }
- }
- }.start();
- }
用 HttpClient 实现 POST 提交:
- public void load(View view){
- final String qq = et_qq.getText().toString().trim();
- final String pwd = et_pwd.getText().toString().trim();
- if (TextUtils.isEmpty(qq) || TextUtils.isEmpty(pwd)) {
- Toast.makeText(MainActivity.this, "qq号或密码为空", 0).show();
- return;
- }
- final String path = "http://192.168.1.114:8080/qqload/qqload";
- new Thread() {
- public void run() {
- try {
- HttpClient client = new DefaultHttpClient();
- HttpPost httppost = new HttpPost(path);
- List<NameValuePair> parameter = new ArrayList();
- parameter.add(new BasicNameValuePair("qq", qq));
- parameter.add(new BasicNameValuePair("pwd", pwd));
- httppost.setEntity(new UrlEncodedFormEntity(parameter,"utf-8"));
- HttpResponse response = client.execute(httppost);
- int code = response.getStatusLine().getStatusCode();
- if (code == 200) {
- InputStream is = response.getEntity().getContent();
- String result = StreamTools.ReadStream(is);
- Message msg = Message.obtain();
- msg.what = SUCCESS;
- msg.obj = result;
- handler.sendMessage(msg);
- } else {
- Message msg = Message.obtain();
- msg.what = ERROR1;
- handler.sendMessage(msg);
- }
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- Message msg = Message.obtain();
- msg.what = ERROR2;
- handler.sendMessage(msg);
- }
- }
- }.start();
- }
使用开源框架实现 get/post 提交:
利用框架实现 get/post 提交不需要再开启子线程。直接在主线程进行 get/post 的提交,大大的减少了工作量。但操作前需要导包。然后直接创建一个 AsyncHttpClient 对象,用 AsyncHttpClient 对象的 post 方法和 get 方法,发送请求,并在 AsyncHttpResponseHandler() 对象中获得相应信息。同样若是 post 请求,仍旧需要传递值。这里可以用 RequestParams 对象添加要传递的值。
在文件下添加 jar 包:
用开源框架实现 GET 提交:
- public void load(View view){
- final String qq = et_qq.getText().toString().trim();
- final String pwd = et_pwd.getText().toString().trim();
- if (TextUtils.isEmpty(qq) || TextUtils.isEmpty(pwd)) {
- Toast.makeText(MainActivity.this, "qq号或密码为空", 0).show();
- return;
- }
- final String path = "http://192.168.1.114:8080/qqload/qqload?qq=" + qq
- + "&pwd=" + pwd;
- AsyncHttpClient client = new AsyncHttpClient();
- client.get(path, new AsyncHttpResponseHandler() {
- @Override
- public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
- // TODO Auto-generated method stub
- tv_result.setText(new String(responseBody));
- }
- @Override
- public void onFailure(int statusCode, Header[] headers,
- byte[] responseBody, Throwable error) {
- // TODO Auto-generated method stub
- tv_result.setText("错误原因:" + new String(responseBody));
- }
- });
- }
用开源框架实现 POST 请求:
- public void load(View view){
- final String qq = et_qq.getText().toString().trim();
- final String pwd = et_pwd.getText().toString().trim();
- if (TextUtils.isEmpty(qq) || TextUtils.isEmpty(pwd)) {
- Toast.makeText(MainActivity.this, "qq号或密码为空", 0).show();
- return;
- }
- final String path = "http://192.168.1.114:8080/qqload/qqload";
- AsyncHttpClient client = new AsyncHttpClient();
- RequestParams params = new RequestParams();
- params.add("qq", qq);
- params.add("pwd", pwd);
- client.post(path,params,new AsyncHttpResponseHandler() {
- @Override
- public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
- // TODO Auto-generated method stub
- tv_result.setText(new String(responseBody));
- }
- @Override
- public void onFailure(int statusCode, Header[] headers,
- byte[] responseBody, Throwable error) {
- // TODO Auto-generated method stub
- tv_result.setText(new String(responseBody));
- }
- });
- }
通过以上任何一种方式可以实现的功能是,从安卓手机端提交数据到服务器端,服务器端进行判断,并返回相应的结果。三种方式各有利弊,实现效果相同,在实际的使用过程中可以根据本身的需要进行选择。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持 PHPERZ!
来源: http://www.phperz.com/article/17/0313/314550.html