Android学习:访问网络
1、Get请求和Post请求简介
当客户端与服务器建立了网络链接之后,就可以发送Http请求了。Http请求通常分为Get请求和Post请求两种,下面分别介绍:
1.Get请求
Get:通过请求URI得到资源,一般用于获取/查询资源信息。
Get请求比较简单,只需要在指定的链接地址中,将需要传递的参数通过“?参数名=参数值”的格式进行传递,如果传递的参数不止一个,则需要使用英文半角的“,“将各个参数进行分隔。例如,要传递用户编号和用户名这两个参数,相应的参数传递格式为”http://192.168.1.162:8090/?id=1001,username=AQ".
2.Post请求
Post:用于向服务器提交新的内容。一般用于更新资源信息。
Get请求只能发送大小在1024B以内的数据,如果要发送数据量较大的请求,就需要使用Post请求。不同于Get请求的参数传递方式,Post请求将参数放在HTTP请求的实体内容中,如果需要传递的参数不止一个,则需要使用“&”将各个参数进行连接
相比于Get请求,Post请求的安全性较高,但是速度较慢
2、通过HTTP访问网络
在Android应用程序中,通过HTTP访问网络的方式主要有HttpURLConnection和HttpCient两种,下面介绍二者的基本功能和用法。
2.1、利用HttpURLConnection访问网络
2.1.1.HttpURLConnection简介
HttpURLConnection是一种多用途、轻量级的HTTP客户端,使用它来进行HTTP操作,可以适用于大多数的应用程序。
HttpURLConnection是java的标准类,继承自URLConnection抽象类,无法直接实例化对象,通过调用openCollection()方法获得对象实例。可以通过Get方式或者Post方式,向指定的网络发送HTTP请求和获取HTTP响应。
2.1.2.HttpURLConnection用法
利用HttpURLConnection发送请求及接收响应,一般可分为一下几个步骤。
(1)创建一个URL对象,基本用法代码如下:
URL urlConn = new URL(http://www.163.com);
(2) 调用URL对象的openConnection()来获取HttpURLConnection对象实例,基本用法代码如下:
HttpURLConnection urlConn = (HttpURLConnection)url.openConnection();
(3)调用getInputStream()方法获得服务器返回的输入流,基本用法代码如下:
InputStream in = conn.getInputStream();
(4)读取并处理(解码)服务器返回的输入流
bitmap = BitmapFactory.decodeStream(in);
(5)调用disconnect()方法关闭HTTP链接,基本用法代码如下:
conn.disconnect();
示例
开发一个Android应用程序,利用HttpURLConnection发送Get请求,从本地或者web服务器中下载图片
XML布局代码如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:layout_height="fill_parent"android:gravity="center"android:orientation="vertical"><TextViewandroid:id="@+id/textView1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="下载并显示一张网络图片"/>
<ImageViewandroid:id="@+id/imageView1"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_weight="0.8" />
<Buttonandroid:id="@+id/button1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="开始下载"/>
</LinearLayout>
打开MainActivity.java文件,重写其中的onCreate()方法及其其他对应方法,并将此前选择的网络图片的URL编入其中,具体代码如下:
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import com.aaa.httpurldemo.R;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.io.IOException;
public class MainActivity extends AppCompatActivity {Button visitWebBtn = null;Button button1 = null;TextView textView1 = null;ImageView imageView1 = null;
@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);imageView1 = (ImageView)findViewById(R.id.imageView1);button1 = (Button)findViewById(R.id.button1);//创建下载图片按钮的点击事件监听器button1.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//TODO Auto-generated method stubString imgUrl;//某个现有网络web服务器上的图片imgUrl = "https://img0.baidu.com/it/u=2862534777,914942650&fm=253&fmt=auto&app=138&f=JPEG?w=889&h=500";//自建web服务器上的图片URL//imgUrl = "http://192.168.1.128:8086/house.png";new DownImgAsyncTask().execute(imgUrl);}});}//从指定的URL中获取图片private Bitmap getImageBitmap(String url){URL imgUrl = null;Bitmap bitmap = null;try{//1.创建一个URL对象imgUrl = new URL(url);//2.获取HttpURLConnection对象实例HttpURLConnection conn = (HttpURLConnection)imgUrl.openConnection();conn.setDoInput(true);conn.connect();//3.获得服务器返回的输入流InputStream is = conn.getInputStream();//4.解码数据流bitmap = BitmapFactory.decodeStream(is);is.close();//5.断开连接conn.disconnect();}catch (MalformedURLException e){
Toast.makeText(this,"图片下载失败,请确定网络图片是否存在",Toast.LENGTH_LONG).show();} catch (IOException e) {Toast.makeText(this,"图片下载失败,请确定网络服务是否正常",Toast.LENGTH_LONG).show();}return bitmap;}//利用异步任务机制下载图片class DownImgAsyncTask extends AsyncTask<String,Void,Bitmap> {@Overrideprotected void onPreExecute() {super.onPreExecute();imageView1.setImageBitmap(null);}
@Overrideprotected Bitmap doInBackground(String... params) {Bitmap b = getImageBitmap(params[0]);return b;}
@Overrideprotected void onPostExecute(Bitmap result){super.onPostExecute(result);if(result!=null){imageView1.setImageBitmap(result);}}}
}
在AndroidManifest.xml文件的application节点之前添加相应的权限,以获得访问互联网的许可,具体代码如下:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.aaa.httpurldemo"><!--注册网络访问权限--><uses-permission android:name="android.permission.INTERNET"/><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/AppTheme"><activityandroid:name="zut.edu.httpurldemo.MainActivity"android:exported="true"><intent-filter><action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application>
</manifest>
运行即可。
2.2、利用HttpClient访问网络
2.2.1.HttpClient简介
一般情况下,如果只是需要向web站点的某个简单页面提交请求并获取服务器响应,HttpURLConnection是完全可以胜任的,但多数情况下,web站点的网页可能并不是通过一个简单的URL就可以访问,而是需要用户登录并且具有相应的权限才可以访问该页面,这就涉及Session和Cookie等相关数据的处理,如果是利用HttpURLConnection来实现这种网络访问,程序的设计就会比较烦琐。
Apache开源组织提供了一个HttpClient项目,由其名称可见,它是一个简单的Http客户端(并不是浏览器),是一个增强版的HttpURLConnection,可以用于发送HTTP请求和接收HTTP响应。由于Android已经成功地集成了HttpClient,所以在Android应用程序中,使用HttpClient发送请求和接收响应更简单一些。
2.2.2.HttpClient用法
利用HttpClient发送请求及接收响应,一般可以分为以下几个步骤。
(1)创建代表客户端的HttpClient对象。
(2)创建代表请求的对象,如果需要发送Get请求,则创建HttpGet对象;如果需要发送Post对象,则创建HttpPost对象。
附加步骤:如果需要发送请求参数,Get方式可以使用拼接字符串的方式,把参数拼接在结尾;Post方式需要使用setEntity()方式来设置请求参数。
(3)调用HttpClient对象的execute()方法发送请求,执行该方法后,将获得服务器返回的HttpResponse对象。服务器返回的数据就在这个HttpResponse响应中。
(4)检查相应状态是否正常。服务器发给客户端的响应中应有一个响应码。
200表示“正常”,此时,调用HttpResponse的getEntity()方法就可以获取服务器的响应头和响应内容等。
404表示“客户端错误”
505表示“服务器端错误”
(5)调用disconnect()关闭HTTP链接,基本用法代码如下:
urlConn.disconnect();
Android学习:访问网络相关推荐
- Android 如何访问网络
Android 如何访问网络 MainActivity代码块 Layout代码块 主界面图片: 运行结果: MainActivity代码块 一.绑定定控件,然后通过点击按钮获取url,由于打开url获 ...
- android多线程访问网络,Android Day05-网络编程之文件下载之多线程断点续传技术
文件下载之多线程断点续传技术底层实现 通过HttpURLConnection连接 断点续传核心步骤: 1.UI设计 2.获取服务器文件的大小,通过连接的一个方法getContentLength()来得 ...
- Android之访问网络,使用HttpURLConnection还是HttpClient?
<span style="font-family: Arial; font-size: 14px; background-color: rgb(255, 255, 255);" ...
- Android多媒体学习六:访问网络上的Audio对应的M3U文件,实现网络音频流的播放
Android中提供了对网络上流媒体的支持,我们可以使用MediaPlayer类来播放一个网络上的音频文件. 但是网络上的站点并不建议我们直接访问流,我们需要获取他提供的M3U文件,根据M3U文件来实 ...
- Android学习笔记第五篇--网络连接与云服务(一)
Android学习笔记第五篇–网络连接与云服务 第一章.无线连接设备 除了能够在云端通讯,Android的无线API也允许在同一局域网内的设备通讯,**甚至没有连接网络,而是物理具体相近,也可以相 ...
- android访问网络的方法,Android Http协议访问网络实例(3种)
之前关于Android Http协议访问网络的一点分析,最近需要回顾,就顺便发到随笔上了 Android中http连接主要是为了获取网络数据,目前了解的有3种方法: Httpconnection -- ...
- Android学习笔记-Wifi网络操作
Wifi网卡状态 WIFI_STATE_DISABLED Wifi网卡不可用 WIFI_STATE_DIABLING Wifi网卡正在关闭 WIFI_STATE_ENABLED Wifi网卡可用 WI ...
- 解决android模拟器不能访问网络的问题
解决android模拟器不能访问网络的问题 参考文章: (1)解决android模拟器不能访问网络的问题 (2)https://www.cnblogs.com/oriental/p/11750330. ...
- Android模拟器访问pc与网络的问题
1. 模拟器(m)访问本机pc *:m访问本地pc时 本地服务地址为localhost 在m中要替代为10.0.2.2: *:或者直接用本地IP 要区别pc上的ip和android里面的ip,用an ...
最新文章
- java中对Excel的创建、样式修改
- 约瑟夫生死环游戏c语言程序,使用C++实现的约瑟夫生死游戏
- 5-5 表格输出 (5分)
- 【12】 全国外电音DJ 3000首 32G
- 全球芯片厂商今年设备支出将再增10% 超过980亿美元
- 零信任风口来了,新一代企业安全架构革新势在必行
- 你真的需要全栈开发吗?
- CSS 之怀疑自己的审美 1 (Day49)
- 商业数据分析的层次与步骤有哪些
- IMSettings 1.5.1 发布,输入法设置工具
- 购买了正版的supermemo 15,花了60$
- 学而思初中全套网课+讲义【春季班,暑假班,秋季班,寒假班】
- MYSQL可重复读及原理、快照读和当前读
- 传统零售业务分析指标整理
- 「实战篇」开源项目docker化运维部署-前端java部署(八)
- 2020版本idea 左视图跟随主视图定位操作
- 想瘦身不伤体质,就要学会和脂肪做朋友
- 99mTc-MIBI类毕业论文文献都有哪些?
- pandas小节 索引,排序
- 大数据学习笔记-------------------(17_3)