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;@Overrideprotected 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() {@Overridepublic 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;}@Overridepublic 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;}@Overridepublic 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的操作肯定是比较多的,与具体的业务结合起来,那还是相当复杂,这一块还是要重点掌握,多学多练。事情要做好还有很需要下一番功夫,哎,我就是这样一个懒散的人,以后再完善吧。

转载于:https://www.cnblogs.com/supertonny/p/4406730.html

Android学习二:Http操作相关推荐

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

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

  2. SpringBoot 学习二:操作数据库

    2019独角兽企业重金招聘Python工程师标准>>> 本文将从以下几个方面介绍: 前言 配置数据源 SpringBoot 整合 Mybatis SpringBoot 整合 Jdbc ...

  3. android学习(二十一) 下载数据减少电池损耗

    高效的网络访问(优化下载) 使用无线网络下载数据是你的应用消耗电池潜在的重要原因之一.为了降低和网络有关的activity连接导致的电池消耗.你理解你的连接模型怎样影响无线硬件这是很关键的. 下面将介 ...

  4. 我的android学习二视图的控制者 Activity--Activity的生命周期

    据说成功的男人背后总会有一个管事的女人,同样的,android程序中华丽丽的界面下,也必须有一个控制着,它便是Activity. 首先,Activity是程序的一个组件,它提供一个或者多个的界面作为程 ...

  5. dagger android 学习(二):AndroidInjector的使用

    本系列博客主要用于自己学习积累,顺便帮助新手入门,如有问题,多多包涵.更详细的一些使用可以看看其他更加详细的博客. dagger android 学习(一):dagger基础使用 dagger and ...

  6. Android OpenGL ES 学习(二) -- 图形渲染管线和GLSL

    OpenGL 学习教程 Android OpenGL ES 学习(一) – 基本概念 Android OpenGL ES 学习(二) – 图形渲染管线和GLSL Android OpenGL ES 学 ...

  7. 【转】 Pro Android学习笔记(二十):用户界面和控制(8):GridView和Spinner

    目录(?)[-] GridView Spinner GridView GridView是网格状布局,如图所示.在了解ListView后,很容易了解GridView.下面是例子的XML文件. <? ...

  8. Android学习之登陆界面设计(二)基本界面设计

    Android学习之登陆界面设计(二)基本界面设计 前提 绘图样式 - drawable bg_login_btn_submit.xml bg_login_panel_slide.xml bg_log ...

  9. Android 学习之《第一行代码》第二版 笔记(二十三)Material Design 实战 —— 卡片式布局

    实现基础: Android 学习之<第一行代码>第二版 笔记(二十二)Material Design 实战 -- 悬浮按钮和可交互提示 卡片式布局 卡片式布局是 Materials Des ...

最新文章

  1. gps两点距离 php,PHP应用:PHP计算百度地图两个GPS坐标之间距离的方法
  2. “快准顺”而不是“信达雅”
  3. DevOps组织中应用架构师的新定位与实践
  4. 向量范数证明例题_第八课:向量的范数
  5. 编写一个APPlet,再随机的位置上画出几个随机大小的矩形。
  6. 医学遗传学词汇英语术语英文(Glossary) 5
  7. AliSQL 配置安装
  8. 黑苹果efi制作_黑苹果微星B450AMD完美方案分享包括EFI制作工具及教程
  9. 最好用图像处理库CxImage入门
  10. Linux下笔记本电源管理
  11. TeamViewer远程控制软件,让你享受远程办公的便利
  12. python行与行之间必须对齐_Python中列名及其对应行的对齐
  13. 【已解决】格式化SD卡提示“这张磁盘有写保护”,试过将SD开关拨向两边,均失败。
  14. Few-shot transfer learning for intelligent fault diagnosis of machine(机器智能故障诊断中的小样本迁移学习)
  15. 服务器开机显示f1 f2,开机提示按F1/F2才能进入系统的解决方法
  16. 13- 数据建模-建模方法三:实体建模
  17. 关于“差强人意”成语的误用
  18. 检查计算机的更新红叉,快速解决win10更新后没有声音小喇叭有个红叉解决教程...
  19. 用python画小狗,用turtle画个单身狗送给自己~
  20. http1,http1.1,http2及http3

热门文章

  1. java 百度爬虫_零基础写Java知乎爬虫之先拿百度首页练练手
  2. apache tomcat php mysql 配置_Apache与Tomcat服务器整合的基本配置方法及概要说明
  3. 数据结构链表实验c语言程序,数据结构实验练习(—):链表实现100位数的加减法...
  4. elisa标准曲线怎么做_ELISA标准曲线制作方法.pdf
  5. dajngo3新建app,并且访问
  6. matlab读取数据 溢出,matlab读取400多兆的wav数据,内存溢出,如何解决
  7. vscode 乱码_如何使用VS Code 编辑Keil项目(51/STM32)
  8. 单体 soa 微服务 区别_每日一读-从单体到微服务,这些年架构的演变
  9. python下载大文件mp4_Python 下载 m3u8 格式视频
  10. nvidia的jetson系列的方案_NVIDIAJetson系统在工业网络中的集成