Android 给服务器发送网络请求

Posted 羸弱的澳龙

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 给服务器发送网络请求相关的知识,希望对你有一定的参考价值。

今天听得有点蒙,因为服务器的问题,这边建立服务器的话,学长用的是Idea建立的Spring之类的方法去搞服务器。

然后就是用android去给这个服务器发送请求,大致效果还是懂的,就是像网站发送请求,然后登录网站。

我们用http协议访问网络:

它的工作原理特别简单,就是客户端向服务器发出一条 HTTP请求,服 务器收到请求之后会返回一些数据给客户端,然后客户端再对这些数据进行解析和处理就可以了。

我们主要用的是HttpURLConnection请求。

 

 

 

我们连接网络得如下写法:下面选择的第一句就是连接网络,第三句是使用明文流量,

什么是 android:usesCleartextTraffic

android:usesCleartextTraffic 指示应用程序是否打算使用明文网络流量,例如明文HTTP。目标API级别为27或更低的应用程序的默认值为“ true”。面向API级别28或更高级别的应用默认为“ false”。

当属性设置为“ false”时,平台组件(例如,HTTP和FTP堆栈,DownloadManager和MediaPlayer)将拒绝应用程序使用明文流量的请求。强烈建议第三方库也采用此设置。避免明文通信的主要原因是缺乏机密性,真实性和防篡改保护;网络攻击者可以窃听所传输的数据,并且还可以对其进行修改而不会被检测到。

 

大概意思就是安全性的问题,我认为还是必须得写的。

 

 

 我们可以先写个活动,连接到百度,发送请求并获取百度的信息:

 

这里面的句柄(handler)可以忽略不看,

至于handler是啥,大牛的网站献上:

https://blog.csdn.net/zjpp2580369/article/details/81290620

handler.post()其实和runOnUiThread的功能差不多,让子线程连接到主线程。

请求的话我们一般的固定写法就是先:

URL url = new URL("http://www.baidu.com");//它会报异常,抓一下或者抛都行。

HttpURLConnection connection = (HttpURLConnection) url.openConnection(); //这一步就是发送http请求。

我们写这个就是为了在服务器上获取数据,所以我们用post。

接着因为要获取,得调用输入流,把网站传过来的数据用字节形式存下来

这是学java的字节IO流的固定套路,就是循环读入数组,接着就是根据

数组放入String变量里,从0-len意思就是全部读入。

最后吧信息写到message文本控件里

。那么这里为什么要用这个 runOnUiThread()方法呢?

这是因为 Android是不允许在子线程中进行 UI操作的,我们需要通过这个方法将线程切换到主线程,然后 再更新 UI 元素。不过我们现在并没有操作很多东西,就没在里面写内容了。

最后说一下为啥要新建个线程,因为网络这块好像不能在主线程里写。所以要新建一个线程,而我们UI操作却要到主线程里,所以切换到主线程的时候得想到runOnUiThread;

 

 

 

 

 我们的布局也不贴了,就是一个文本控件,然后在活动得到信息。

最后就是得到一个百度的html代码;

 

 

上代码:先上布局,布局用ScrollView:

因为我们要用请求得到网站的东西可能会很多,一页看不完。

 

 

 上边是写个登录的界面,上活动:

 

 

 

看起来挺复杂的。

这个活动里的OnCreate里还是挺简单的,就是连接布局并连接控件。

我们连接控件并且调用自己写的登录方法,

请求的话我们一般的固定写法就是先:

URL url = new URL("http://www.baidu.com");//它会报异常,抓一下或者抛都行。

HttpURLConnection connection = (HttpURLConnection) url.openConnection(); //这一步就是发送http请求。

这种写法,学长写的地址是测试自己写的服务器的,不过10.0.2.2是哪个地址?

因为模拟器和安卓使用的本地ip不是计算机的127.0.0.1,它是自己自带的地址,我们如果写localhost或者回路地址的话是找不到的,后面的两个是服务器里写的参数,我们相当于调用了个方法,把参数传过去。

我们还可以用很多连接时对网站的定制方法,比如请求的方式:

connection.setRequestMethod("GET"); //获取网站的信息,好像是默认的,post就是提交信息上去。

connection.setConnectTimeout(8000);//这两个分别是连接超时和读取超时,都是毫秒。

connection.setReadTimeout(8000); 

 

我们写这个就是为了在服务器上获取数据,所以我们用post。

接着因为要获取,得调用输入流,把网站传过来的数据用字节形式存下来

这是学java的字节IO流的固定套路,就是循环读入数组,接着就是根据

数组放入String变量里,从0-len意思就是全部读入。

最后吧信息写到message文本控件里

。那么这里为什么要用这个 runOnUiThread()方法呢?

这是因为 Android是不允许在子线程中进行 UI操作的,我们需要通过这个方法将线程切换到主线程,然后 再更新 UI 元素。不过我们现在并没有操作很多东西,就没在里面写内容了。

最后说一下为啥要新建个线程,因为网络这块好像不能在主线程里写。所以要新建一个线程,而我们UI操作却要到主线程里,所以切换到主线程的时候得想到runOnUiThread;

 

 

 

总结:主要是理解Android请求网络的步骤和方法,以及一些基础步骤的运行。

 

以上是关于Android 给服务器发送网络请求的主要内容,如果未能解决你的问题,请参考以下文章

Android网络请求知识(三)授权,TCP/IP,HTTPS建立过程

Android 手机卫士--构建服务端json请求网络数据

说说在 Android 中如何发送 HTTP 请求

如何监控android网络请求

Android使用Http协议访问网络

Android第八讲笔记-1(网络编程)