1.初步认识HTTP

HTTP(Hypertext Transfer Protocol超文本传输协议)是网络应用层协议,建立在TCP/IP基础上,HTTP使用可靠的TCP连接,默认端口是80。

较常用的HTTP为GET和POST,不同在于GET通过在请求URL中设定参数来查询,POST则是以表单的形式将数据发送给web端

2.Android下HTTP操作

package org.tonny.httpUtil;

import java.util.List;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils; public class HttpService {
private HttpClient _httpClient = null;
private HttpGet _httpGet = null;
private HttpPost _httpPost = null; private HttpResponse _httpResponse = null;
private HttpEntity _responseEntity = null;
private HttpEntity _requestEntity = null; public HttpService() {
_httpClient = new DefaultHttpClient();
} public String get(String url) throws Exception {
// http请求对象
_httpGet = new HttpGet(url); // 执行GET请求
_httpResponse = _httpClient.execute(_httpGet); // 200表示请求成功
if (_httpResponse.getStatusLine().getStatusCode() == 200) {
_responseEntity = _httpResponse.getEntity();
return EntityUtils.toString(_responseEntity);
} else {
return null;
}
} /**
*
* @param url
* 请求的URL地址
* @param params
* POST的参数,使用键值对的方式传入
* @return
* @throws Exception
*/
public String post(String url, List<NameValuePair> params) throws Exception {
_httpPost = new HttpPost(url); //注意这里需要请求实体
_requestEntity = new UrlEncodedFormEntity(params);
_httpPost.setEntity(_requestEntity);
_httpResponse = _httpClient.execute(_httpPost);
if (_httpResponse.getStatusLine().getStatusCode() == 200) { //数据返回还是使用实体
_responseEntity = _httpResponse.getEntity();
return EntityUtils.toString(_responseEntity);
} else {
return null;
}
}
}

这里封装了POST和GET请求,这里只处理了返回字符形式的,对于字节形式(如图片文件)还需要修改一下

package org.tonnny.httptest;

import java.util.ArrayList;
import java.util.List; import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import org.tonny.httpUtil.HttpService; import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.app.Activity; public class MainActivity extends Activity {
private EditText _txtUrl = null;
private TextView _lblInfo = null;
private Handler _handler = null; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
this._txtUrl = (EditText) this.findViewById(R.id.txtUrl);
this._lblInfo = (TextView) this.findViewById(R.id.lblInfo); // 这里使用handler实现work线程和UI线程的通信,主要是work线程向UI发送消息,所以在这里定了了消息的处理方法
this._handler = new Handler() {
@Override
public void handleMessage(Message msg) {
String content = String.valueOf(msg.obj);
Log.d("Main in UI ", content);
_lblInfo.setText(content);
}
};
} /**
* 这里没有采用定义类的方式,而是直接在activity_main中定义onclick属性来实现
* @param v
*/
public void OnBtnGetClick(View v) {
// String url = this._txtUrl.getText().toString().trim();
String url = "http://www.baidu.com";
GetThread work = new GetThread(url);
work.start();
} /**
* 这里POST的参数需要设置好
* @param v
*/
public void OnBtnPostClick(View v) {
// String url = this._txtUrl.getText().toString().trim();
String url = "http://mail.163.com/";
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("savelogin", "0"));
params.add(new BasicNameValuePair("url2",
"http://mail.163.com/errorpage/error163.htm"));
params.add(new BasicNameValuePair("username", "***"));
params.add(new BasicNameValuePair("passowrd", "***"));
PostThread work = new PostThread(url, params);
work.start();
} /**
* Get work线程类
* @author Tinny Cheung
*
*/
private final class GetThread extends Thread {
private String _url; public GetThread(String url) {
_url = url;
} @Override
public void run() {
HttpService getMethod = new HttpService();
try {
String res = getMethod.get(_url);
Message msg = _handler.obtainMessage();
msg.obj = res;
_handler.sendMessage(msg);
} catch (Exception e) {
e.printStackTrace();
}
}
} /**
* Post work线程类
* @author Tinny Cheung
*
*/
private final class PostThread extends Thread {
private String _url;
private List<NameValuePair> _params; public PostThread(String url, List<NameValuePair> params) {
_url = url;
_params = params;
} @Override
public void run() {
HttpService postMethod = new HttpService();
try {
String res = postMethod.post(_url, _params);
Message msg = _handler.obtainMessage();
msg.obj = res;
_handler.sendMessage(msg);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}

这里实现对上面封装类的使用,由于邮箱涉及个人隐私问题,所以没有写上去。读者可以通过Http Analyzer之类的工具简单的分析就可以获取到相关的数据。

另外要说的是,此处设计用到了线程间的通信,使用的loop-handler方法来实现,具体细节代码中已有体现。最后记得在清单文件加入许可,如下:

<uses-permission android:name="android.permission.INTERNET"/>

3.总结

个人觉得以后项目中Http的操作肯定是比较多的,与具体的业务结合起来,那还是相当复杂,这一块还是要重点掌握,多学多练。事情要做好还有很需要下一番功夫,哎,我就是这样一个懒散的人,以后再完善吧。

Android学习二:Http操作的更多相关文章

  1. openfire Android学习(二)----对分组、好友和头像等一些操作

    一.查询所有分组 通过Roster来获取所有分组,Roster可以通过connection.getRoster()来得到. [java] view plaincopy /** * 获取所有组 * *  ...

  2. Android学习之Image操作及时间日期选择器

    一.基础学习 1.ImageView是图片容器,就相当于RadioGroup是RadioButton的容器一样,是View的直接子类. 1: <ImageView 2: android:id=& ...

  3. Android学习二_八:Animation的使用(一) (转)

    一.Animations介绍 Animations是一个实现android UI界面动画效果的API,Animations提供了一系列的动画效果,可以进行旋转.缩放.淡入淡出等,这些效果可以应用在绝大 ...

  4. [jQuery学习系列二 ]2-JQuery学习二-数组操作

    前言 上一篇内容 已经对于Jquery 有了一些认识, 包括Jquery的选择器和DOM对象, 那么这一篇继续来看下Jquery中很实用的Jquery对于数组的操作. Jquery中对数组的操作大致有 ...

  5. android学习日记09--BitMap操作

    Bitmap android里的图像处理重要的类,支持jpg.png.bmp等格式的图像,BitmapDrawable是封装Bitmap的一个对象,Bitmap实现在android.graphics包 ...

  6. Android学习之蓝牙操作

    BluetoothAdapter 用法 蓝牙运行原理:通过BluetoothAdapter 蓝牙适配器处理任务,如果蓝牙被启动之后,系统会自动去搜索其它设备,如果匹配到附近的设备就发送一个广播,Bro ...

  7. [jQuery学习系列三 ]3-JQuery学习二-字典操作

    前言:如果看过了第一篇和第二篇, 相信大家会对jQuery有个初步的认识了, 对于jQuery的选择器和数组的操作都已经很熟悉了, 这一篇就单独罗列jQuery中字典的操作相关的内容. 1. 数组中添 ...

  8. android学习二(Activity)

    前面我简单的介绍了android的一些基础知识,当作热身吧,接下来接触android的四大组件的activity活动. 1.活动Activity是是一种保护用户界面的组件,主要用于和用户进行交互. 活 ...

  9. jquery 学习(二) - 属性操作

    html代码 <div class="n1" zdy="z1">AAA <p>1111111</p> <input t ...

随机推荐

  1. openssl证书相关

    http://blog.csdn.net/modianwutong/article/details/43059435 http://www.cnblogs.com/E7868A/archive/201 ...

  2. caffe中python接口的使用

    下面是基于我自己的接口,我是用来分类一维数据的,可能不具通用性: (前提,你已经编译了caffe的python的接口) 添加 caffe塻块的搜索路径,当我们import caffe时,可以找到. 对 ...

  3. winform小程序---猜拳小游戏

    因为学的时间不长,所以借鉴了一些资料做了这个小程序,大家共同学习,共同进步.感觉很有自信,世上无难事,只怕有心人. using System; using System.Collections.Gen ...

  4. QQ(iOS)客户端的粘性动画效果

    qq的app中要是有新的联系人发消息过来,相应联系人的cell右边会有一个红色的圆圈表示消息条数.如果去触碰那个圆圈,可以发现它竟然会跟着手指的移动而移动. 在一定范围内,手指离开屏幕,会发现红色圆圈 ...

  5. vim 替换操作

    全局替换真正使用的是两个ex命令 g(global) 和 :s(switch) 1.替换命令语法 :s/old/new/ 这将把当前模式中的第一个old替换为new 2.替换命令语法 :s/old/n ...

  6. laravel 控制器里 redirect url地址传两个参数的方法

    public function red_search() { $url=Request::all(); return redirect('search/'.$url['category'].'/'.$ ...

  7. oracle表空间不足相关问题解决办法

    欢迎和大家交流技术相关问题: 邮箱: jiangxinnju@163.com 博客园地址: http://www.cnblogs.com/jiangxinnju GitHub地址: https://g ...

  8. python3 登录接口

    登录接口 功能: 输入用户名(有一个用户名及对应的密码表) 认证成功后显示欢迎信息  输错三次后锁定(即第四次提示该账户已被锁定)用户登录锁定记录写到一个文件中. 用到:自定义函数.列表.字典 #Au ...

  9. NGINX 内存池有感

    写在前面 写NGINX系列的随笔,一来总结学到的东西,二来记录下疑惑的地方,在接下来的学习过程中去解决疑惑. 也希望同样对NGINX感兴趣的朋友能够解答我的疑惑,或者共同探讨研究. 整个NGINX系列 ...

  10. “LC.exe”已退出,代码为 -1

    造成这个问题的原因一般是引入了第三方插件,自己遇到的问题是引入了devexpress...... 1.找到Properties文件夹licenses.licx文件,然后右键选择删除就可以了,调试运行正 ...