Android系列之网络(一)----使用HttpClient发送HTTP请求(通过get方法获取数据)

深入解析JESD204B Subclass 1中的SYSREF与LMFC同步机制 本文深入解析了JESD204B Subclass 1协议中的核心同步机制,重点阐述了SYSREF信号如何作为系统级参考,对齐所有设备内部的本地多帧时钟(LMFC),从而实现高速多通道数据采集系统中的确定性延迟。文章结合实战经验,详细说明了硬件设计、时序要点及软件配置流程,是解决多ADC芯片同步对齐问题的关键指南。 阅读详情
【正文】 

一、HTTP协议初探:

HTTP(Hypertext Transfer Protocol)中文 “超文本传输协议”,是一种为分布式,合作式,多媒体信息系统服务,面向应用层的协议,是Internet上目前使用最广泛的应用层协议,它基于传输层的TCP协议进行通信,HTTP协议是通用的、无状态的协议。

这几个名词有一种通俗的解释:

  • 通讯协议:双方对话的标准
  • 通用的:用了都说好,谁用谁知道
  • 无状态的:翻脸不认人
  • 超文本:除了文本,还可以是音频、视频

HTTP协议与Android开发之间的关系:

HTTP协议的学习重点:

  • Http协议基础概念、
  • 请求响应模型、
  • 提交请求的不同方法、
  • 响应状态判断、
  • 获取响应以及解析响应、
  • 数据下载的实现方法、
  • 数据上传的实现方法、
  • 请求头详细内容、
  • 响应头详细内容等

关于http协议的学习,推荐两个链接:

http://www.cnblogs.com/TankXiao/archive/2012/02/13/2342672.html

http://blog.youkuaiyun.com/gueter/article/details/1524447

 

二、http协议概念:
1、http协议定义:
WWW是以Internet作为传输媒介的一个应用系统,WWW网上基本的传输单位是Web网页。WWW的工作是基于客户机/服务器计算模型,由Web浏览器和Web服务器构成,两者之间采用超文本传输协议HTTP进行通信。
HTTP协议时基于TCP/IP协议之上的协议,是Web浏览器和Web服务器之间的应用层的协议,是通用的、无状态的面向对象的协议。  
如果要实现网络互联我们要思考两个需要解决的技术问题:
  • 第一:浏览器和服务器是通过什么来连接的。
  • 第二:这种连接方式是怎么实现的。
通过Internet去发送到服务器当中,而Internet内部可以通过三种方式来实现发送信息和数据:
  • 第一种:HTTP协议,也是在工作中最常用的,是建立在TCP/IP基础上实现的。
  • 第二种:FTP协议
  • 第三种:TCP/IP协议,它也是最底层的协议,其它的方式必须是要通过它,但是要想实现这种协议必须要实现socket编程,这种方法是用来上传一些比较大的文件,视频,进行断点续传的操作。
2、客户端连接服务器实现内部的原理如下:
分析上图,步骤如下:
  • 第一步:在浏览器客户端中得到用户输入的内容。 
  • 第二步:浏览器得到这个网址之后,内部会将这个域名发送到DNS上,进行域名解析。得到它的IP之后就会链接到指定的服务器上,假如服务器的地址是:221.104.13.32:80,从浏览器到服务器端口它使用到最底层的TCP/IP协议。 
  • 第三步:实现TCP/IP协议用Socket来完成,使用了Socket的套接字。 
  • 第四步:服务器端的80端口监听客户端的链接,这样客户端到服务器就链接上了。
  • 服务器接收到这些内容之后,并按照这些请求的路径找到对应的页面,进一步找到对应的网页内容,返回给客户端。
通俗一点讲,用户在浏览器输入网址,通过http协议发出去,网址经过DNS域名解析,解析成指定的ip地址,并在80端口上监听用户的请求。服务器监听到请求之后,会以三种方式返回给客户端:HTML、XML、JASON。
HTTP返回请求数据的三种方式:
  • 1、以HTML代码内容返回。 
  • 2、以XML字符串的形式返回,在以后的android开发中这种形式返回数据比较多。 
  • 3、以JSON对象形式返回,在网络流量上考虑JSON要比XML方式要好一些,便于解析。
在Android当中,一般使用xml和Json数据解析。

 

三、使用HTTP协议访问网络:

Android中的WebView控件已经在后台帮我们处理好了发送HTTP请求、接收服务响应、解析返回数据,以及最终的页面展示这几步工作,不过由于它封装得太好了,反而不能直观地看出HTTP协议是如何工作的。因此接下来我们通过手动发送HTTP请求的方式,来更加深入的了解这一过程。

在Android上发送HTTP请求的方式一般有两种:HttpURLConnection和HttpCient。我们先来学习HttpCient。

 

四、HttpCient:

HttpClient是Apache开源组织提供的HTTP网络访问接口(一个开源的项目),从名字上就可以看出,它是一个简单的HTTP客户端(并不是浏览器),可以发送HTTP请求,接受HTTP响应。但是不会缓存服务器的响应,不能执行HTTP页面中签入嵌入的JS代码,自然也不会对页面内容进行任何解析、处理,这些都是需要开发人员来完成的。

现在Android已经成功集成了HttpClient,所以开发人员在Android项目中可以直接使用HttpClient来想Web站点提交请求以及接受响应,如果使用其他的Java项目,需要引入进相应的Jar包。HttpClient可以在官网上下载。官网链接:http://hc.apache.org/downloads.cgi

HttpClient其实是一个interface类型,HttpClient封装了对象需要执行的Http请求、身份验证、连接管理和其它特性。既然HttpClient是一个接口,因此无法创建它的实例。从文档上看,HttpClient有三个已知的实现类分别是:AbstractHttpClient, AndroidHttpClient, DefaultHttpClient,会发现有一个专门为Android应用准备的实现类AndroidHttpClient,当然使用常规的DefaultHttpClient也可以实现功能。

从两个类包所有在位置就可以看出区别,AndroidHttpClient定义在android.net.http.AndroidHttpClient包下,属于Android原生的http访问,而DefaultHttpClient定义在org.apache.http.impl.client.DefaultHttpClient包下,属于对apche项目的支持。而AndroidHttpClient没有公开的构造函数,只能通过静态方法newInstance()方法来获得AndroidHttpClient对象。

简单来说,用HttpClient发送请求、接收响应都很简单,只需要五大步骤即可:(要牢记)

  • 创建代表客户端的HttpClient对象。
  • 创建代表请求的对象,如果需要发送GET请求,则创建HttpGet对象,如果需要发送POST请求,则创建HttpPost对象。注:对于发送请求的参数,GET和POST使用的方式不同,GET方式可以使用拼接字符串的方式,把参数拼接在URL结尾;POST方式需要使用setEntity(HttpEntity entity)方法来设置请求参数。
  • 调用HttpClient对象的execute(HttpUriRequest request)发送请求,执行该方法后,将获得服务器返回的HttpResponse对象。服务器发还给我们的数据就在这个HttpResponse相应当中。调用HttpResponse的对应方法获取服务器的响应头、响应内容等。
  • 检查相应状态是否正常。服务器发给客户端的相应,有一个相应码:相应码为200,正常;相应码为404,客户端错误;相应码为505,服务器端错误。
  • 获得相应对象当中的数据

 

五、DefaultHttpClient:

根据上面的五大步骤,我们就拿DefaultHttpClient举例来访问网络。注意这里有一条原则:在主线程中不能访问网络(在android4.0之后的加入的概念)。

【实例】点击按钮,获取百度首页的文本内容

新建工程文件m04_http01。完整版代码如下:

首先是布局文件,虽然比较简单,但还是贴上吧。

activity_main.xml代码如下:

复制代码
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity" >

    <Button
        android:id="@+id/button1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Send Request" />

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent" >

        <TextView
            android:id="@+id/TextView1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@string/hello_world" />
    </ScrollView>

</LinearLayout>
复制代码

布局文件中,我们用一个ScrollView来包裹TextView。借助ScrollView控件的话,就可以允许我们一滚动的形式查看屏幕外i的那部分内容。

MainActivity.java的代码如下:(注释比较详细)

复制代码
 1 package com.example.m04_http01;
 2 
 3 import org.apache.http.HttpEntity;
 4 import org.apache.http.HttpResponse;
 5 import org.apache.http.client.HttpClient;
 6 import org.apache.http.client.methods.HttpGet;
 7 import org.apache.http.impl.client.DefaultHttpClient;
 8 import org.apache.http.util.EntityUtils;
 9 import android.app.Activity;
10 import android.os.Bundle;
11 import android.os.Handler;
12 import android.os.Message;
13 import android.view.View;
14 import android.view.View.OnClickListener;
15 import android.widget.Button;
16 import android.widget.TextView;
17 
18 public class MainActivity extends Activity {
19 
20     public static final int SHOW_RESPONSE = 0;
21     
22     private Button button_sendRequest;
23     private TextView textView_response;
24     
25     //新建Handler的对象,在这里接收Message,然后更新TextView控件的内容
26     private Handler handler = new Handler() {
27 
28         @Override
29         public void handleMessage(Message msg) {
30             super.handleMessage(msg);
31             switch (msg.what) {
32             case SHOW_RESPONSE:
33                 String response = (String) msg.obj;
34                 textView_response.setText(response);
35                 break;
36 
37             default:
38                 break;
39             }            
40         }
41 
42     };
43     
44     @Override
45     protected void onCreate(Bundle savedInstanceState) {
46         super.onCreate(savedInstanceState);
47         setContentView(R.layout.activity_main);
48         textView_response = (TextView)findViewById(R.id.TextView1);
49         button_sendRequest = (Button)findViewById(R.id.button1);
50         
51         button_sendRequest.setOnClickListener(new OnClickListener() {
52             
53             //点击按钮时,执行sendRequestWithHttpClient()方法里面的线程
54             @Override
55             public void onClick(View v) {
56                 // TODO Auto-generated method stub
57                 sendRequestWithHttpClient();
58             }
59         });
60     }
61 
62     //方法:发送网络请求,获取百度首页的数据。在里面开启线程
63     private void sendRequestWithHttpClient() {
64         new Thread(new Runnable() {
65             
66             @Override
67             public void run() {
68                 //用HttpClient发送请求,分为五步
69                 //第一步:创建HttpClient对象
70                 HttpClient httpCient = new DefaultHttpClient();
71                 //第二步:创建代表请求的对象,参数是访问的服务器地址
72                 HttpGet httpGet = new HttpGet("http://www.baidu.com");
73                 
74                 try {
75                     //第三步:执行请求,获取服务器发还的相应对象
76                     HttpResponse httpResponse = httpCient.execute(httpGet);
77                     //第四步:检查相应的状态是否正常:检查状态码的值是200表示正常
78                     if (httpResponse.getStatusLine().getStatusCode() == 200) {
79                         //第五步:从相应对象当中取出数据,放到entity当中
80                         HttpEntity entity = httpResponse.getEntity();
81                         String response = EntityUtils.toString(entity,"utf-8");//将entity当中的数据转换为字符串
82                         
83                         //在子线程中将Message对象发出去
84                         Message message = new Message();
85                         message.what = SHOW_RESPONSE;
86                         message.obj = response.toString();
87                         handler.sendMessage(message);
88                     }
89                     
90                 } catch (Exception e) {
91                     // TODO Auto-generated catch block
92                     e.printStackTrace();
93                 }
94                 
95             }
96         }).start();//这个start()方法不要忘记了        
97         
98     }    
99 }
复制代码

大致流程如下:

这里,我们添加了一个sendRequestWithHttpClient()方法(第63行),并在点击事件中去调用这个方法。在这个方法中,先开启了一个子线程。

69至81行:在子线程中使用HttpClient发出一条HTTP请求,请求的目标地址是百度的首页。

83至87行:为了能让结果在界面上显示出来,将服务器返回的数据放到了Message对象中,并用Handler将Message发出去。

需要注意的是:

第80行的entity就是服务器发还给客户端的数据。

最后要记得在清单文件中声明访问网络的权限:

复制代码
<uses-sdk  android:minSdkVersion="8"   android:targetSdkVersion="16" />
<uses-permission android:name="android.permission.INTERNET"/>
复制代码

程序运行后,点击按钮,显示结果如下:

服务器返回给我们的就是这种HTML代码,只是通常情况下浏览器都会将这些代码解析成漂亮的网页后再展示出来。

参考链接:http://www.cnblogs.com/plokmju/p/Android_apacheHttpClient.html

文章来源:http://www.cnblogs.com/smyhvae/p/4004983.html


LVGL core disp显示设计(lv_disp.c) lv_disp.c当前显示页面的配置scr_act在原始的LVGL是以screen的概念存在,但我们还是习惯叫它为一个页面提供获取top_layer、sys_layer、prev_scr图层接口配置主题管理默认的主题管理是递归查找的,实际项目中因此页面的复杂性,虽然也兼容了此主题管理的方案,但还是推荐使用单页面自行管理主题的方案壁纸设置多页面切换的动画支持计算无用户操作时间清理显示缓存。 阅读详情

相关推荐

zemax双透镜公差分析

蒙特卡罗分析: 评估公差的整体影响,模拟过程中产生一系列随机的lens,满足指定的公差,然后再按照标准评估。公差分析,就是在设计了一个理想的系统后,想看看实际生产过程中如果产生公差(误差),系统会坏到什么程度,也就是光学性能受到多大影响。反灵敏度分析:分别对每个公差在性能方面的一个给定的最小允许减少量来计算公差,也就是限制了系统性能的变化,和灵敏度分析方向相反。灵敏度分析对每个公差单独求值,分别计算每个公差操作数的最大、最小、标准值(如上图)所有设计上可能的公差都列出来了。注意要固定透镜的口径。

fendoudecheng的博客 3207

Android Studio的代码笔记--HttpClient学习

HttpClient的get方式使用笔记Get获取数据步骤实例展示 Get获取数据步骤 1.创造HttpClient对象 2.创造HttpGet请求对象(访问的服务器地址) 3.执行请求,服务器响应结果放在请求对象中 4.根据状态码判断请求结果,200表示正常 5.取出返回对象的entity里的数据 实例展示 新建一个类HttpclientClass public class HttpclientClass { public static String getDataString(String

weixin_45208598的博客 725

手把手教你修改miniwiggler配置信息,解决UDE连接问题(附FT_PROG工具下载)

本文详细介绍了如何使用FT_PROG工具修改miniwiggler配置信息,解决UDE连接问题。通过分析FT2232芯片的EEPROM结构,提供从驱动安装到配置烧写的完整流程,帮助开发者实现无缝连接英飞凌TriBoard开发板。文章还包含常见错误解决方案和高级批量配置技巧。

weixin_30919429的博客 374

AndroidStudio中HttpClient的简单使用

AndroidStudio是google近几年发布的Android开发工具。在eclipse中Apache的HttpClient并不能在AndroidStudio中找到,因为google并不推荐使用该类。 httpClient的使用方法 HttpClient是Apache Jakarta Common下的子项目,用来提供高效的、最新的、功能丰富的支持HTTP协议的客户端编程工具包,并且它支持H

qq_31599907的博客 1689

VINS技术路线与代码详解

VINS技术路线 写在前面:本文整和自己的思路,希望对学习VINS或者VIO的同学有所帮助,如果你觉得文章写的对你的理解有一点帮助,可以推荐给周围的小伙伴们,当然,如果你有任何问题想要交流,欢迎随时探讨。话不多说,下面上正文。 VINS代码地址:https://github.com/HKUST-Aerial-Robotics/VINS-Mono 参考文档:1.VINS-Mono A R...

wangshuailpp的博客 7万+

Xilinx-复旦微-FPGA-眼图BlockDesign系统制作-针对PCIE系统

XIlinx-复旦微电子-FPGA-眼图BlockDesign系统制作-针对PCIE系统,手把手教你如何建立眼图测试

weixin_43444334的博客 2596

Android HTTP请求方式:HttpClient

获得Cookie:cookie = loginResponse.getFirstHeader(“Set-Cookie”).getValue();其实关于HttpClient的例子有很多,比如笔者曾经用它来抓学校教务系统上学生的课程表: 这就涉及到Cookie,模拟登陆的东西,说到抓数据(爬虫),一般我们是搭配着JSoup来解析 抓到数据的,有兴趣可以自己查阅相关资料,这里贴下笔者毕设app里获取网页部分的关键 代码!// 先发送get请求 获取cookie值和__ViewState值。

D0126_的博客 812

终端里藏了个AI大神!DeepSeek‑TUI让你的命令行直接起飞

DeepSeek-TUI:终端AI编程神器 DeepSeek-TUI是一款专为开发者设计的终端AI编程工具,基于DeepSeek V4模型,提供100万Token超大上下文支持,适合处理复杂项目。其核心优势包括: 轻量高效:单二进制文件,无需依赖环境,支持SSH远程操作 智能交互:实时流式输出推理过程,支持三档模式(Plan/Agent/YOLO)灵活切换 强大功能:集成文件读写、Git管理、Shell执行等工具,支持一键回滚和持久会话 节省成本:智能压缩与缓存优化,显著降低Token消耗 适用于服务器开发

960

android 5.1 httpclient,【Android进阶学习】Http编程之HttpClient

在Android开发中,Android SDK附带了Apache的HttpClient,它是一个完善的客户端。它提供了对HTTP协议的全面支持,可以使用HttpClient的对象来执行HTTP GET和HTTP POST调用。HTTP工作原理:1.客户端(一般是指浏览器,这里是指自己写的程序)与服务器建立连接2.建立连接后,客户端向服务器发送请求3.服务器接收到请求后,向客户端发送响应信息4.客户...

weixin_42363303的博客 573

山东大学FPGA课程实验一 加法器设计

电子设计自动化与FPGA设计,实验一 加法器设计

2503_91283667的博客 869

回声消除AEC初探

那段保留即可——在播放期间把麦克风关闭(软件层面的 mute),同样能根除回声,只是会失去“一句话期间仍能捕获背景噪声”的能力。如果还有更细节的需求(比如多语言 TTS、实时流式 ASR),欢迎继续交流。的完整示例,可直接拷贝、改造、集成到你现有的 LLM‑TTS 对话系统中。实际效果取决于用户设备的硬件与驱动,若仍有回声,可让用户佩戴。把扬声器信号(把播放音频拷贝给 AEC)从麦克风流中减去。:TTS 播放的声音被同一个麦克风再次捕获,导致声学回声。三种实现示例,帮助你快速落地。,几乎可以消除所有回声。

NLP与推荐算法 571

http协议服务器发送数据方法,(一)----使用HttpClient发送HTTP请求(通过get方法获取数据)...

(一)----使用HttpClient发送HTTP请求(通过get方法获取数据)一、HTTP协议初探:HTTP(Hypertext Transfer Protocol)中文 “超文本传输协议”,是一种为分布式,合作式,多媒体信息系统服务,面向应用层的协议,是Internet上目前使用最广泛的应用层协议,它基于传输层的TCP协议进行通信,HTTP协议是通用的、无状态的协议。这几个名词有一种通俗的解释...

weixin_39976413的博客 2004

仿真学习系列(三十):Sigrity设计文件(Altium Designer和Allegro)导入

很多刚接触 Sigrity 的工程师都会产生疑问:Sigrity 功能这么多,是不是门槛很高?我能学得会吗? 其实,Sigrity 的核心并不在“操作难”,而是在“理解仿真背后的机理”。一旦掌握基本流程,你会发现它并没有想象中那么复杂,反而能大大提升你的高速设计能力。本节内容,就是从最简单的一步开始 —— 把你的设计文件正确导入 Sigrity。

案例文章,高速信号 521

Android入门:用HttpClient模拟HTTP的GET和POST请求

一、HttpClient介绍 HttpClient是用来模拟HTTP请求的,其实实质就是把HTTP请求模拟后发给Web服务器; Android已经集成了HttpClient,因此可以直接使用; 注:此处HttpClient代码不只可以适用于Android,也可适用于一般的Java程序; HTTP GET核心代码: (1)DefaultHttpCli

xiazdong 1万+

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

上一篇: Android系列之网络(二)—-HTTP请求头与响应头
下一篇: Android系列之网络(三)----使用HttpClient发送HTTP请求(分别通过GET和POST方法发送数据)
富贵编程之路
博客等级 码龄11年 19粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值