Android中的网络(字节跳动)
文章目录
- RESTful API
- 对REST的解释
- 资源与URI
- 什么是URI
- HTTP URL的组成
- Http 接口
- JSON
- Http资源
- XML
- JSON
- Android中对JSON的处理
- 方法一:org.json.JSONObject
- 方法二:GSON(toJson,fromJson)
- Retrofit
RESTful API
对REST的解释
REST描述的是在网络中客户端和服务端的一种交互形式
(Resource) REpresentational State Transfer 直译为 资源的表现层状态转移
1.Resource:资源,即数据。比如 friends等
(1)http://api.qc.com/v1/friends: 获取某人的好友列表;
(2)http://api.qc.com/v1/profile: 获取某人的详细信息
2.Representational:某种表现形式,比如用JSON,XML,JPEG等;
3.State Transfer:状态变化。通过HTTP动词实现(如Get、Post)。
资源与URI
什么是URI
要让一个资源可以被识别,需要有个唯一标识,在Web中这个唯一标识就是URI(Uniform Resource Identifier)。
URI既可以看成是资源的地址,也可以看成是资源的名称。
URI的设计应该遵循可寻址性原则,具有自描述性,需要在形式上给人以直觉上的关联。
使用/来表示资源的层级关系,使用?用来过滤资源(理解成筛选资源)
HTTP URL的组成
Http 接口
GET 用来获取资源
POST 用来新建资源(也可以用于更新资源)
PUT 用来更新资源
DELETE 用来删除资源
get请求会将请求参数拼接到url后面
post请求的参数会放到body里面(好处是参数长度不受限制)
JSON
Http资源
文本资源可以采用html、xml、json等格式,图片可以使用PNG或JPG展现出来。
XML
可扩展标记语言(Extensible Markup Language,简称:XML)是一种标记语言。
标记指计算机所能理解的信息符号,通过此种标记,计算机之间可以处理包含各种信息的文章等。
特点:以某个结点开始,再以某个结点结束
JSON
- JavaScript Object Notation,JavaScript对象表示法。
- 是一种由道格拉斯·克罗克福特构想和设计、轻量级的数据交换语言。
- 该语言以易于让人阅读的文字为基础,用来传输由属性值或者序列性的值组成的数据对象。
- 尽管JSON是JavaScript的一个子集,但JSON是独立于语言的文本格式。
可以通过以下网址格式化JSON,以及,判断字符串是不是正确得JSON https://www.bejson.com/
键值对的值一定是以下6个类型之一
❏ JSON strings { “name”:“John” }
❏ JSON Numbers, integer or float { “age”:30 }
❏ JSON Objects {“employee”:{ “name”:“John”, “age”:30, “city”:“New York” }}
❏ JSON Arrays {“employees”:[ “John”, “Anna”, “Peter” ]}
❏ JSON Booleans { “sale”:true }
❏ JSON null { “middlename”:null }
注意:中括号表示数组,大括号表示对象
Android中对JSON的处理
方法一:org.json.JSONObject
分为两步
- 生成json字符串(put方法)
public static void generateJsonString() {try {JSONObject jsonObject = new JSONObject();JSONObject tempJson = new JSONObject();tempJson.put("min", 11.34);tempJson.put("max", 19.01);jsonObject.put("temp", tempJson);JSONObject weatherJSON = new JSONObject();weatherJSON.put("id",801);weatherJSON.put("condition","Clouds");weatherJSON.put("description",null);jsonObject.put("weather",weatherJSON);jsonObject.put("success", true);JSONArray jsonArray = new JSONArray();jsonArray.put("Adam");jsonArray.put("Bob");jsonArray.put("John");jsonObject.put("notification_user_id", jsonArray);Log.d("JsonDemo", jsonObject.toString());} catch (JSONException e) {e.printStackTrace();}}
- 解析json(get和opt方法)
public static void parseJsonString() {String s = "{\"temp\":{\"min\":11.34,\"max\":19.01},\"success\":true,\"notification_user_id\":[\"Adam\",\"Bob\",\"John\"]}";//可以通过www.bejson.com/ “压缩并转义”得到try {JSONObject jsonObject = new JSONObject(s);//要把字符串传进来JSONObject temp = jsonObject.getJSONObject("temp");double min = temp.getDouble("min");double max = temp.getDouble("max");JSONArray notificationUserId = jsonObject.getJSONArray("notification_user_id");ArrayList<String> strings = new ArrayList<>();//JSONArray和ArrayList<String>不同for (int i = 0; i < notificationUserId.length(); i++) {strings.add(notificationUserId.getString(i));}boolean success = jsonObject.optBoolean("success");boolean unexist = jsonObject.optBoolean("unexist",true);//返回默认值trueLog.d("JsonDemo", "success:" + unexist);} catch (JSONException e) {Log.d("JsonDemo", "crash:"+e.getMessage());e.printStackTrace();}}
小结:opt方法在没有对应值的时候可以返回一个默认值,而get方法会报错
方法二:GSON(toJson,fromJson)
在解析复杂数据和生成复杂字符串时方便很多,可以直接把一个类转化成JSON
首先要在build.gradle的依赖里面加入
implementation 'com.google.code.gson:gson:2.8.6'
例如,想建立People这个类的JSON
public class People{public int age;public String name;public People friend;public List<String> friends;
}
在GsonDemo中
public static void generateGsonString(){Gson gson = new Gson();People people = new People();people.age = 21;people.name = "yoyo";People myFriend = new People();myFriend.age = 21;myFriend.name = "wyc";people.friend = myFriend;ArrayList<String> friends = new ArrayList<>();friends.add("sss");friends.add("ddd");friends.add("nnn");people.friends = friends;String s = gson.toJson(people);//直接把一个类转化成JSON
}
反之,如何将一个JSON转化成对象呢,GSON也只用一行代码
①如果是一个对象
public static void parseGsonString(){String s = "";//这里JSON字符串略Gson gson = new Gson();People people = gson.fromJson(s,People.class);//JSON转化成对象
}
注:如果想查看,可以在People类加上toString()方法,就能打印转化出来的对象
②如果是对象的集合
public static void parseGsonString(){String s = "";//这里JSON字符串略Gson gson = new Gson();List<People> peoples = gson.fromJson(s, new TypeToken<List<People>>(){}.getType());
}
@SerializedName 注解的使用
如果在JSON字符串中的"firstname"属性对应的是People类中的"name"属性
那么可以在People类中
public class People{public int age;@SerializedName("firstname")//表示对应要解析的字段public String name;public People friend;public List<String> friends;
}
这样两者就能够对应起来
该注解在生成JSON时也会产生作用
Retrofit
首先,需要在AndroidManifest.xml中配置两个权限
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
然后在build.gradle的依赖里面加入
implementation "com.squareup.retrofit2:retrofit:2.8.1"
implementation 'com.squareup.retrofit2:converter-gson:2.4.0'//将返回值转换成JSON
定义ApiService接口
import retrofit2.Call;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.GET;
import retrofit2.http.POST;public interface ApiService {// https://wanandroid.com/wxarticle/chapters/json@GET("wxarticle/chapters/json")Call<ArticleResponse> getArticles(@Query("user") String name);// todo 添加api// https://www.wanandroid.com/user/register//方法:POST// username,password,repassword@FormUrlEncoded@POST("user/register")Call<UserResponse> register(@Field("username")String username,@Field("password")String password,@Field("repassword")String repassword);
}
在MainActivity类里面
private void getData() {Retrofit retrofit = new Retrofit.Builder().baseUrl("https://wanandroid.com/")//这是上面那个url的前半截.addConverterFactory(GsonConverterFactory.create()).build();ApiService apiService = retrofit.create(ApiService.class);apiService.getArticles().enqueue(new Callback<ArticleResponse>() {@Overridepublic void onResponse(Call<ArticleResponse> call, Response<ArticleResponse> response) {if (response.body() != null) {List<ArticleResponse.Article> articles = response.body().articles;Log.d("retrofit", articles.toString());if (articles.size() != 0) {mAdapter.setData(response.body().articles);mAdapter.notifyDataSetChanged();}}}@Overridepublic void onFailure(Call<ArticleResponse> call, Throwable t) {Log.d("retrofit", t.getMessage());}});}
Android中的网络(字节跳动)相关推荐
- Android中的多线程(字节跳动)
文章目录 Handler机制(Android中的消息队列机制) Handler机制为Android系统解决了以下两个问题 Handler常用方法 Handler的使用 补充知识点 Handler原理 ...
- android中怎么网络判断,Android中判断网络是否连接实例详解
Android中判断网络是否连接实例详解 在android中,如何监测网络的状态呢,这个有的时候也是十分重要的,方法如下: public class ConnectionDetector { priv ...
- 一个整合OkHttp 、Retrofit 、Volley 、RxJava、Novate多种开源网络框架的项目,高度的封装和集成,Android中Web网络请求一行代码解决
一个整合OkHttp .Retrofit .Volley .RxJava.Novate多种开源网络框架的项目,高度的封装和集成,Android中Web网络请求一行代码解决 AndroidHttp 一个 ...
- Android中的网络编程-黄俊东-专题视频课程
Android中的网络编程-1902人已学习 课程介绍 剔除繁杂的理论,注重实践,深入浅出讲解Android中的网络编程 课程收益 每一个学员都能系统地掌握Android中的网 ...
- 请画图说明tcp/ip协议栈_5年Android程序员面试字节跳动两轮后被完虐,请查收给你的面试指南 - Android木子李老师...
大家应该看过很多分享面试成功的经验,但根据幸存者偏差的理论,也许多看看别人面试失败在哪里,对自己才更有帮助. 最近跟一个朋友聊天,他准备了几个月,刚刚参加完字节跳动面试,第二面结束后,嗯,挂了- 所以 ...
- 人生中第一次面试-----字节跳动面试经验总结
20190801 我经历了人生中的第一次面试,一面感觉还行,二面有点惨.(一面和二面是连在一起的),三面也很惨,四面也好惨.然后坚持到hr面. 未来的事情好多不确定,但是唯一要做的还是要不断充实自己, ...
- android无网络状态栏,Android中检查网络连接状态的变化,无网络时跳转到设置界面...
在AndroidManifest.xml中加一个声明 1. 2. 3. 4. 5. NetCheckReceive.java文件如下 1.import android.content.Broadcas ...
- Android高级工程师面试题-字节跳动,含BATJM大厂
其实如果你技术深度足够,大必不用为就业而忧愁.每个行业何尝不是这样,最开始的风口,到慢慢的成熟.Android初级在2020年的日子里风光不再, 靠会四大组件就能够获取到满意薪资的时代一去不复返.** ...
- Android中Http网络请求库框架Volley和Asnyc-http的使用---第三方库学习笔记(一)
Volley框架: 特点: 通信更快,更简单 Get,Post网络请求及网络图像的高效率异步处理请求. 当多个请求时,对网络请求进行排序,按优先级处理 当网络状况不好时,Volley可以自动对上次请求 ...
最新文章
- akaze特征匹配怎么去掉不合适的点_SIFT特征点
- 用户信息检索另一台服务器,客户机上一用户访问另一台机器上的informix数据库...
- SQL临时表的生存期问题
- mysql php 封装类_市面上几款常见的微信开发框架对比(PHP和JAVA)
- 数据库自治服务DAS论文入选全球顶会SIGMOD,领航“数据库自动驾驶”新时代
- 线程间操作无效 progressBar2线程不能被访问
- leetcode21
- servlet 调用oracle数据库存储过程
- idea 使用 maven 整合 ssm 框架 实现简单的增、删、改 和 分页查询功能
- 运维工具 Ansible 快速入门教程
- Elasticsearch增删改查 之 —— Delete删除
- python的数据模型_python高级(一)—— python数据模型(特殊方法)
- linux电脑内存查看工具,Linux内存查看工具---Smem
- (数据挖掘-入门-9)聚类
- Sublime Text 2.0.2 注册码
- 艾德卡EDEKA EDI 需求分析
- Dreamweaver CC 2018/64位下载地址及安装教程
- QGIS在地图上绘制经纬网
- Installed Build Tools revision 32.0.0 is corrupted. Remove and install again using the SDK Manager
- 百度贴吧顶帖软件机器人