汕头站扩建有连接华东线吗,html5网站建设平台,装修公司形象墙设计,wordpress部署wampAndroid 网络编程-网络请求 文章目录 Android 网络编程-网络请求一、主要内容二、开发网络请求前的基本准备1、查看需要请求的网址是否有效#xff08;1#xff09;通过网页在线验证#xff08;2#xff09;使用专用window网咯请求工具#xff08;3#xff09;编写app代码…Android 网络编程-网络请求 文章目录 Android 网络编程-网络请求一、主要内容二、开发网络请求前的基本准备1、查看需要请求的网址是否有效1通过网页在线验证2使用专用window网咯请求工具3编写app代码验证 2、学会把服务器的json数据转换成Bean对象3、具体效果测试简单测试的网址天气apiapipost调试网址 1get请求在浏览器窗口栏请求的显示2get请求在在线请求网址的显示3post请求在在线请求的的网址显示4json数据在线转换成Bean对象应用app效果显示 三、代码介绍1、普通网络请求1get网络请求2Post网络请求 2、使用OkHttp网络框架请求网络1Get网络请求2Post网络请求 3、使用Retrofit网络框架请求网络1Get网络请求①创建请求接口对象② 具体的请求代码 2Post网络请求①创建请求接口对象② 具体的请求代码 4、使用WebView显示对应网址的网页(1)在布局文件写入控件WebView(2) 设置基本参数 三、总结1、网络请求是要在子线程内进行2、不同框架的网络请求根据项目具体情况使用3、Android 网络编程要学习些什么1网络分层和HTTP协议基本知识比如请求报文和响应报文2Java网络编程基础TCP/UDP 进行连接交互3Json数据转Gson对象4Android基本网络请求和基本网络框架使用5加密算法数据加密和解密 本文介绍一下Android 网络请求开发了简单demo适合Android入门人员学习。
为啥要写这个给应届生看的。。。
一、主要内容
1、开发网络请求前的基本准备 2、普通网络请求代码 3、使用OkHttp网络框架请求网络代码 4、使用Retrofit网络框架请求网络代码 5、使用WebView显示对应网址的网页 6、应用demo的相关代码和apk
二、开发网络请求前的基本准备
1、查看需要请求的网址是否有效
1通过网页在线验证
能验证get请求和简单的post 请求比如只设置几个参数的post请求 在线get/post请求测试里面还有一系列工具 http://www.jsons.cn/httpurl/ http://coolaf.com/
//可以简单模拟 get/post返回的数据 https://v7.apipost.cn/#/apis/design
2使用专用window网咯请求工具
① PostMan ② Apifox (国内自研PostMan加强版支持网页和桌面工具) https://apifox.com/#pricing
3编写app代码验证
一般用于验证文件上传的情况 也可以用windows 工具进行验证Apifox 也是支持文件上传的。
2、学会把服务器的json数据转换成Bean对象
在线转换Json格式转换JAVA实体Bean类 http://www.jsons.cn/json2java/
作用 把字符串的数据赋值到对象使用的时候直接使用 Object.getXXX 获取返回的某个信息。
也可以使用Android Studio 插件GsonFormat
3、具体效果测试
get请求测试可以找网上天气网址的api或者笑话类的api网址 post请求测试可以找地图类的api百度地图或者语音类的api网址讯飞。
简单测试的网址
天气api
提供天气气象查询https://www.yiketianqi.com/index/doc get请求网址 https://v0.yiketianqi.com/api?unescape1versionv61appid28392918appsecretNo9zfo8fadcode440307000000
apipost调试网址
提供get/post简单调试功能https://v7.apipost.cn/#/apis/design 注册登陆后看起来是可以设计返回的数据的估计是操作要麻烦一点有需要的可以自己研究。
post请求网址 https://demo-api.apipost.cn/api/demo/login mobile18289454846ver_code123456
1get请求在浏览器窗口栏请求的显示 2get请求在在线请求网址的显示 3post请求在在线请求的的网址显示
post 请求在浏览器输入行直接是无法请求到数据的只能使用专业的网址或者工具 获取post请求的数据。 4json数据在线转换成Bean对象 应用app效果显示
主界面
普通网络请求 OkHttp网络请求
retrofit网络请求 为啥这里TextView显示的不对大家可以在代码里面看看。
WebView界面
应用demo里面显示了很多WebView界面这里只展示其中一个。
代码资源下载地址
https://download.csdn.net/download/wenzhi20102321/88215651
三、代码介绍
1、普通网络请求
网络请求一定要在子线程执行否则会报错。 数据返回后要显示在界面上要切换回主线程。
1get网络请求 //get方法请求网络public void getNetwork(View view) {GET_UTL et_url_get.getText().toString();LogUtil.debugInform(GET_UTL GET_UTL);//创建线程请求网络new Thread(new Runnable() {Overridepublic void run() {// 创建一个URL对象URL url null;try {url new URL(GET_UTL);// 创建一个HttpURLConnection对象并设置请求方法为GETHttpURLConnection connection null;connection (HttpURLConnection) url.openConnection();connection.setRequestMethod(GET);connection.setConnectTimeout(5000);// 获取服务器响应的状态码int responseCode 0;responseCode connection.getResponseCode();if (responseCode HttpURLConnection.HTTP_OK) {// 读取服务器响应的数据BufferedReader reader new BufferedReader(new InputStreamReader(connection.getInputStream()));StringBuilder response new StringBuilder();String line;while ((line reader.readLine()) ! null) {response.append(line); //把读取的数据不断放入response对象中}reader.close();// 在UI线程中更新UI runOnUiThreadString responseData response.toString();}} catch (Exception e) {e.printStackTrace();LogUtil.error(, e);}}}).start();}
2Post网络请求
//post方法请求王网络public void postNetwork(View view) {//创建线程请求网络new Thread(new Runnable() {Overridepublic void run() {// 创建一个URL对象URL url null;try {url new URL(POST_UTL);// 创建一个HttpURLConnection对象并设置请求方法为GETHttpURLConnection connection null;connection (HttpURLConnection) url.openConnection();connection.setConnectTimeout(5000);//------------------------------ 区别和Get方法 Startconnection.setRequestMethod(POST);// 启用输出流以便向服务器发送数据connection.setDoOutput(true);// 创建一个输出流对象并将数据写入输出流OutputStream outputStream connection.getOutputStream();String postData POST_MESSAGE;outputStream.write(postData.getBytes());outputStream.flush();outputStream.close();//------------------------------ 区别和Get方法 End// 获取服务器响应的状态码int responseCode connection.getResponseCode();if (responseCode HttpURLConnection.HTTP_OK) {// 读取服务器响应的数据BufferedReader reader new BufferedReader(new InputStreamReader(connection.getInputStream()));StringBuilder response new StringBuilder();String line;while ((line reader.readLine()) ! null) {response.append(line); //把读取的数据不断放入response对象中}reader.close();// 在UI线程中更新UI// 处理服务器响应的数据String responseData response.toString();}} catch (Exception e) {e.printStackTrace();LogUtil.error(, e);}}}).start();}
2、使用OkHttp网络框架请求网络
1Get网络请求
//get方法请求网络public void getNetwork(View view) {Request request new Request.Builder().url(GET_UTL).get() //默认为get 不设置也行.build();Call call client.newCall(request);//网络请求的回调call.enqueue(new Callback() {Overridepublic void onFailure(NonNull Call call, NonNull IOException e) {Toast.makeText(OkhttpNetworkActivity.this, 请求错误 e.getMessage(), Toast.LENGTH_LONG).show();}Overridepublic void onResponse(NonNull Call call, NonNull Response response) throws IOException {// 处理服务器响应的数据String responseData response.body().string();LogUtil.debugInform(responseData responseData);// TODO: 在这里处理服务器响应的数据}});}2Post网络请求
//post方法请求王网络public void postNetwork(View view) {//创建网络处理的对象OkHttpClient client new OkHttpClient.Builder().readTimeout(5, TimeUnit.SECONDS).build();//mobile18289454846ver_code123456//post请求来获得数据//创建一个RequestBody存放重要数据的键值对RequestBody body new FormBody.Builder().add(mobile, 18289454846).add(ver_code, 123456).build();//创建一个请求对象传入URL地址和相关数据的键值对的对象Request request new Request.Builder().url(POST_UTL).post(body).build();//创建一个能处理请求数据的操作类Call call client.newCall(request);//使用异步任务的模式请求数据call.enqueue(new Callback() {Overridepublic void onFailure(Call call, IOException e) {LogUtil.error(, e);}Overridepublic void onResponse(Call call, Response response) throws IOException {// 在UI线程中更新UIString responseData response.body().string();LogUtil.debugInform(result responseData);}});}
3、使用Retrofit网络框架请求网络
1Get网络请求
请求示例网址 https://v0.yiketianqi.com/api?unescape1versionv61appid28392918appsecretNo9zfo8fadcode440307000000
①创建请求接口对象
package com.example.networkdemo.retrofit;import com.example.networkdemo.bean.WeatherBean;import retrofit2.Call;
import retrofit2.http.GET;
import retrofit2.http.Query;/*** Get请求* 这里使用get请求的方式请求数据* 并且到的是字符串数据*/
public interface RetrofitWeatherService {//键值对的定义和数据的返回类型的定义这里是String//https://v0.yiketianqi.com/api?unescape1versionv61appid28392918appsecretNo9zfo8fadcode440307000000//这里使用 Field 是会报错是要使用 QueryGET(api)//get请求方式CallWeatherBean getWeather(Query(unescape) String unescape, Query(version) String version,Query(appid) String appid, Query(appsecret) String appsecret, Query(adcode) String adcode);
}
② 具体的请求代码
比如在某个Activity写如下代码
//get方法请求网络public void getNetwork(View view) {Retrofit retrofit getGsonRetrofit(GET_UTL);RetrofitWeatherService weatherService retrofit.create(RetrofitWeatherService.class);//?unescape1versionv61appid28392918appsecretNo9zfo8fadcode440307000000CallWeatherBean call weatherService.getWeather(1, v61, 28392918, No9zfo8f, 440307000000);//转换成Call在call对象包含Url的完整地址//可以看到这里使用了create的方法里面传入了请求服务的接口类//并且后面接的是接口类的方法方法里面传入Url地址要的键值对的值//这时call对象就有完整的Url地址就可以请求数据了//使用call对象进行网络数据请求call.enqueue(new CallbackWeatherBean() {//网络数据请求成功的回调方法Overridepublic void onResponse(CallWeatherBean call, ResponseWeatherBean response) {runOnUiThread(new Runnable() {Overridepublic void run() {WeatherBean bean response.body();tv_info.setText(TimeUtil.getTimeString() \n Get请求的数据 bean );String air_tips bean.getAir_tips();String update_time bean.getUpdate_time();String tem1 bean.getTem1();String tem2 bean.getTem2();String tem bean.getTem();Toast.makeText(RetrofitNetworkActivity.this, 天气时间 update_time \n 当前温度 tem ,温度变化 tem2 -- tem1 \n 温馨提示 air_tips, Toast.LENGTH_LONG).show();}});}//网络数据请求失败的回调方法Overridepublic void onFailure(CallWeatherBean call, Throwable t) {tv_info.setText(TimeUtil.getTimeString() \n Get 请求的失败日志 t.getMessage() );}});}2Post网络请求
Post请求网址https://demo-api.apipost.cn/api/demo/login 携带信息mobile18289454846ver_code123456
①创建请求接口对象
package com.example.networkdemo.retrofit;import com.example.networkdemo.bean.LoginBean;import retrofit2.Call;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.POST;/*** 登陆服务器的请求* 这里使用post请求的方式请求数据* 并且到的是一个自定义的对象数据*/
public interface RetrofitLoginService {//https://demo-api.apipost.cn/api/demo/loginPOST(api/demo/login)//Post请求方式FormUrlEncoded //键值对的定义和数据的返回类型的定义这里是StringCallLoginBean login(Field(mobile) String mobile, Field(ver_code) String ver_code);
}
② 具体的请求代码
//post方法请求王网络public void postNetwork(View view) {Retrofit retrofit getGsonRetrofit(POST_UTL); //https://demo-api.apipost.cn/RetrofitLoginService loginService retrofit.create(RetrofitLoginService.class);CallLoginBean call loginService.login(18289454846, 123456);call.enqueue(new CallbackLoginBean() {Overridepublic void onResponse(CallLoginBean call, ResponseLoginBean response) {// 在UI线程中更新UIrunOnUiThread(new Runnable() {Overridepublic void run() {// 处理服务器响应的数据LoginBean loginBean response.body();LogUtil.debugInform(loginBean loginBean);int code loginBean.getCode();LoginBean.DataBean data loginBean.getData();String msg loginBean.getMsg();Toast.makeText(RetrofitNetworkActivity.this, 登陆信息 \n code code , msg msg, Toast.LENGTH_LONG).show();LogUtil.debugInform(data getToken data.getToken());// TODO: 在这里处理服务器响应的数据tv_info.setText(TimeUtil.getTimeString() \n Post请求的数据 response );}});}Overridepublic void onFailure(CallLoginBean call, Throwable t) {runOnUiThread(new Runnable() {Overridepublic void run() {tv_info.setText(TimeUtil.getTimeString() \n Post请求的失败日志 t.getMessage() );}});}});}//返回一个Gson类型的对象public Retrofit getGsonRetrofit(String url) {Retrofit retrofit new Retrofit.Builder().baseUrl(url).addConverterFactory(GsonConverterFactory.create()).build();return retrofit;}//返回一个Gson类型的字符串,public Retrofit getStringRetrofit(String url) {Retrofit retrofit new Retrofit.Builder().baseUrl(url).addConverterFactory(ScalarsConverterFactory.create()).build();return retrofit;}
4、使用WebView显示对应网址的网页
(1)在布局文件写入控件WebView WebViewandroid:idid/web_viewandroid:layout_widthmatch_parentandroid:layout_heightmatch_parent /
(2) 设置基本参数
web_view findViewById(R.id.web_view);WebSettings webSettings web_view.getSettings();//如果访问的页面中要与Javascript交互则webview必须设置支持JavascriptwebSettings.setJavaScriptEnabled(true);webSettings.setDefaultTextEncodingName(utf-8);//设置编码格式//要显示的网址web_view.loadUrl(url); //设置网址
这里只是基本代码还可以设置跳转监听前进后退网页跳转等可以自己调试研究。
三、总结
1、网络请求是要在子线程内进行
2、不同框架的网络请求根据项目具体情况使用
如果频率很多的使用网络请求直接使用原生请求即可不用使用网络框架。 如果使用频率很高可以使用健全的网络框架OkHttp/Retrofit; OkHttp使用简单Retrofit 使用复杂一些但是和很多其他框架可以结合使用比如GsonRxJava等。
3、Android 网络编程要学习些什么
1网络分层和HTTP协议基本知识比如请求报文和响应报文
虽然不一定会用到但是也是要知道里面的知识点。
2Java网络编程基础TCP/UDP 进行连接交互
可以写demo一个作为客户端一个作为服务端连接后进行通讯交互。
3Json数据转Gson对象
网络上数据请求基本都是返回json数据使用Gson对象可以直接转换成对应的对象使用起来比较方便。
但是也有一些网络请求返回的数据不是json数据格式比如xml格式或者其他特定格式。 这个就需要自己写工具类进行解析了。
4Android基本网络请求和基本网络框架使用
不使用网络框架请求网络和使用主流网络框架请求网络。
5加密算法数据加密和解密
因为网络数据是经过加密的所以必须要经过解密才能读取到正常数据。 算法是会使用框架就行了的具体算法一般人写不出来