文章目录

  • 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中的网络(字节跳动)相关推荐

  1. Android中的多线程(字节跳动)

    文章目录 Handler机制(Android中的消息队列机制) Handler机制为Android系统解决了以下两个问题 Handler常用方法 Handler的使用 补充知识点 Handler原理 ...

  2. android中怎么网络判断,Android中判断网络是否连接实例详解

    Android中判断网络是否连接实例详解 在android中,如何监测网络的状态呢,这个有的时候也是十分重要的,方法如下: public class ConnectionDetector { priv ...

  3. 一个整合OkHttp 、Retrofit 、Volley 、RxJava、Novate多种开源网络框架的项目,高度的封装和集成,Android中Web网络请求一行代码解决

    一个整合OkHttp .Retrofit .Volley .RxJava.Novate多种开源网络框架的项目,高度的封装和集成,Android中Web网络请求一行代码解决 AndroidHttp 一个 ...

  4. Android中的网络编程-黄俊东-专题视频课程

    Android中的网络编程-1902人已学习 课程介绍         剔除繁杂的理论,注重实践,深入浅出讲解Android中的网络编程 课程收益     每一个学员都能系统地掌握Android中的网 ...

  5. 请画图说明tcp/ip协议栈_5年Android程序员面试字节跳动两轮后被完虐,请查收给你的面试指南 - Android木子李老师...

    大家应该看过很多分享面试成功的经验,但根据幸存者偏差的理论,也许多看看别人面试失败在哪里,对自己才更有帮助. 最近跟一个朋友聊天,他准备了几个月,刚刚参加完字节跳动面试,第二面结束后,嗯,挂了- 所以 ...

  6. 人生中第一次面试-----字节跳动面试经验总结

    20190801 我经历了人生中的第一次面试,一面感觉还行,二面有点惨.(一面和二面是连在一起的),三面也很惨,四面也好惨.然后坚持到hr面. 未来的事情好多不确定,但是唯一要做的还是要不断充实自己, ...

  7. android无网络状态栏,Android中检查网络连接状态的变化,无网络时跳转到设置界面...

    在AndroidManifest.xml中加一个声明 1. 2. 3. 4. 5. NetCheckReceive.java文件如下 1.import android.content.Broadcas ...

  8. Android高级工程师面试题-字节跳动,含BATJM大厂

    其实如果你技术深度足够,大必不用为就业而忧愁.每个行业何尝不是这样,最开始的风口,到慢慢的成熟.Android初级在2020年的日子里风光不再, 靠会四大组件就能够获取到满意薪资的时代一去不复返.** ...

  9. Android中Http网络请求库框架Volley和Asnyc-http的使用---第三方库学习笔记(一)

    Volley框架: 特点: 通信更快,更简单 Get,Post网络请求及网络图像的高效率异步处理请求. 当多个请求时,对网络请求进行排序,按优先级处理 当网络状况不好时,Volley可以自动对上次请求 ...

最新文章

  1. akaze特征匹配怎么去掉不合适的点_SIFT特征点
  2. 用户信息检索另一台服务器,客户机上一用户访问另一台机器上的informix数据库...
  3. SQL临时表的生存期问题
  4. mysql php 封装类_市面上几款常见的微信开发框架对比(PHP和JAVA)
  5. 数据库自治服务DAS论文入选全球顶会SIGMOD,领航“数据库自动驾驶”新时代
  6. 线程间操作无效 progressBar2线程不能被访问
  7. leetcode21
  8. servlet 调用oracle数据库存储过程
  9. idea 使用 maven 整合 ssm 框架 实现简单的增、删、改 和 分页查询功能
  10. 运维工具 Ansible 快速入门教程
  11. Elasticsearch增删改查 之 —— Delete删除
  12. python的数据模型_python高级(一)—— python数据模型(特殊方法)
  13. linux电脑内存查看工具,Linux内存查看工具---Smem
  14. (数据挖掘-入门-9)聚类
  15. Sublime Text 2.0.2 注册码
  16. 艾德卡EDEKA EDI 需求分析
  17. Dreamweaver CC 2018/64位下载地址及安装教程
  18. QGIS在地图上绘制经纬网
  19. Installed Build Tools revision 32.0.0 is corrupted. Remove and install again using the SDK Manager
  20. 百度贴吧顶帖软件机器人

热门文章

  1. iOS 后台下载及管理库
  2. InfoQ趋势报告:架构和设计领域技术演变详解
  3. SQL SERVER中什么情况会导致索引查找变成索引扫描
  4. dubbo学习过程、使用经验分享及实现原理简单介绍
  5. template.process(root, out)的用法(shiro项目中来的九)
  6. 17.SpringMVC核心技术-拦截器
  7. Python包管理工具Distribute的安装
  8. swift 跳转网页写法
  9. Java接口对Hadoop集群的操作
  10. MS DTC 无法正确处理 DC 升级/降级事件的解决