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());}});}
相关文章:

编写和调试Shader程序(1)
编写和调试Shader程序(1)DirectX EffectEditJohnsonFeng常用的Shader编写程序有ATI Render Monkey和NVIDIA FX Composer,另外还有DirectX自带的EffectEdit。这几款工具都比较容易上手,本文先介绍DirectX的EffectEdit。EffectEdit是DirectX9.0…

(24):(行为型模式) Visitor 访问者模式
[所有分类] 转载于:https://www.cnblogs.com/hyp5490-/p/3891411.html

二十二、新人成才之路《做人七项原则 做一个节俭惜福的人》
人的福报有先天福报和后天福报。先天福报是从出生时,就注定的。你是个有福的人, 还是个福气少的人。比如出身富贵之家的孩子,可能天生福报较大。出身贫穷人家的孩子, 天生福报可能就较小。也有贫苦孩子通过奋斗努力,最…

代码版本控制工具Concurrent Versions System(CVS)的三种用配置库更新本地工作目录文件的方法
(1)选中文件右键->team->update (2)选中文件右键->replace with->latest from HEAD (3)选中文件右键->team->synchronize with repository 注:第三种方法会以可视化的方式让用户对比本地工作目录和远程配置库中文件的区别 可以用当中的copy方法来…

SPOJ AMR10I Dividing Stones --DFS
题意:给n个石头,分成一些部分(最多n部分,随便分),问分完后每部分的数量的乘积有多少种情况。 分析:可以看出,其实每个乘积都可以分解为素数的乘积,比如乘积为4࿰…

Cookie注入是怎样产生的
Cookie注入是怎样产生的 现在很多网站都加了防注入系统代码,你输入注入语句将无法注入~~感觉这样的防注入系统不错,但防注入系统没有注意到 Cookies 的问题!所以就有了Cookies注入~~我们来研究一下怎样情况下才会有Cookies注入!如果你学过ASP…

阿里最强热修复:Sophix 超高速集成与踩坑
超高速集成 public class SophixStubApplication extends SophixApplication {private final String TAG "Sophix";// 此处SophixEntry应指定真正的Application,并且保证RealApplicationStub类名不被混淆。KeepSophixEntry(GowildApplication.class)stat…

安卓开发|自定义监听器的三个步骤
首先,要有一个实现View.OnClickListener接口的类这个类要重写onClick(View v)这个方法,里面加入想要触发的事件将监听器绑定在要监听的组件上,例如 holder.verticalLinear.setOnClickListener(MyAdapter.this);setOnClickListener的参数即为…
自己用C#写一个采集器、蜘蛛(zz)
效果图: 代码如下: usingSystem;usingSystem.Collections.Generic;usingSystem.Text;usingSystem.Net;usingSystem.Web;usingSystem.IO;usingSystem.Collections;usingSystem.Text.RegularExpressions;namespacechinaz { classProgram { …
DataPipeline |《Apache Kafka实战》作者胡夕:Apache Kafka监控与调优
胡夕,《Apache Kafka实战》作者,北航计算机硕士毕业,现任某互金公司计算平台总监,曾就职于IBM、搜狗、微博等公司。国内活跃的Kafka代码贡献者。 前言虽然目前Apache Kafka已经全面进化成一个流处理平台,但大多数的用户…

windows程序移植linux
1,路径名统一用正斜杠“/”。(windows下正反斜杠都识别,linux只认正斜杠。) 2,统一使用UTF-8格式编码。 vim中无法保存汉字时,可输入下列命令: :set fileencodingprc :se…

完美解决方案 | 完全卸载任何版本office残余文件
采用微软官方给的卸载文件,注意需要能够科学上网 然后再用拼夕夕的安装包重装就能装上,不会提示以下 折腾好久,这次亲测有效 参考文章

Struts2的拦截器只允许有权限用户访问action
1、定义拦截器,继承MethodFilterInterceptor package com.life.stuts.interceptor;import java.util.Map;import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;/*** 如果不是login的adction,使…

ZABBIX(八) Zabbix 通知媒介
一、zabbix报警媒介介绍zabbix触发器到了要发送通知的情况下,需要一个中间介质来接收并传递消息给运维。以前使用的是nagios,通常用脚本发送邮件或者发送飞信来达到报警。在此脚本就是一个媒介了。1、E-mail使用sendmail发送邮件,从这边出去的…

Office Live for Small Business--开启您创业的大门
在我印象中,有一段时间了,我一个人或是和一些朋友在一起聊天的时候,脑子里总是会不由自主地琢磨一个问题,我想这个问题或许也常常困扰很多朋友,那就是“房子首付从哪里来”。我不是一个习惯于伸手跟父母要钱的人&#…

webView加载不出网页的一种可能情况
我的webview的Java代码里有以下内容 Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.webview);savedInstanceState getIntent().getExtras();myurl savedInstanceState.getString("url&qu…

GridView 始终显示 Pager 分页行的一种方法
GridView 是 ASP.NET 2.0 新增加的 Web 控件,拥有比 DataGrid 更多的扩展和改进。使用 GridView 可以很容易的实现数据分页,但是遗憾的是,在缺省情况下,当仅有一页数据时, GridView 不显示 Pager 分页行,这…

php 几十万数据导出到csv
2019独角兽企业重金招聘Python工程师标准>>> 参考资料 : https://blog.csdn.net/tim_phper/article/details/77581071 https://www.imooc.com/wenda/detail/316785 /*** 下载/导出到csv文件* param $title 标题栏标题* param $data : array($count M(表…

恍然大悟之原、反、补
曾在很多书籍中看到过关于原码、反码和补码的介绍,都未能够深入理解。今在Richard Blum编写的《汇编语言程序设计》一书中读到关于带符号整数一节的讲解时(确切的说是其中的一句话),的确有茅塞顿开、恍然大悟之感。原文如下&#…

Android中的多线程(字节跳动)
文章目录Handler机制(Android中的消息队列机制)Handler机制为Android系统解决了以下两个问题Handler常用方法Handler的使用补充知识点Handler原理辨析Runnable/Message扩展知识:ANRHandler总结Android中的多线程概念:进程与线程(Process and Thread)Andr…

利用ZYNQ SOC快速打开算法验证通路(5)——system generator算法IP导入IP integrator
一、前言 利用FPGA设计算法一直以来都是热点,同样也是难点。将复杂的数学公式 模型通过硬件系统来搭建,在低延时 高并行性等优势背后极大提高了设计难度和开发周期。Xilinx公司的sysGen(system generator)工具扩展了MATLAB的simul…

JS下计算当前日期(当天)后N天出现NAN或者undefined的情况
前言: 帮客户做一个订单系统,需要一个日期1,一个日期2,默认情况下日期1为当天,日期2为明天,只是当时有些疑惑的是日期2偶尔会出现NAN的情况,今天在segmentfault.com看到了同样的问题,…

VCL 中的 Windows API 函数(6): BeginDeferWindowPos
BeginDeferWindowPos 和 DeferWindowPos、EndDeferWindowPos 是一组一起使用的函数, 可对一组窗口的位置、大小、Z 序等进行调整, 在 ExtCtrls 单元有用到.下面先用常规方法实现对 Panel1 中的一组 Button 进行调整, 然后再用上面三个函数重新实现.本例效果图:代码文件:unit Un…

一行代码解决TabLayout中的tabItem文字被挤压
tabLayout.setTabMode(0);

base64格式的图片数据如何转成图片
base64格式的图片数据如何转成图片 一、总结 一句话总结:不仅要去掉前面的格式串,还需要base64_decode()解码才行。 1 // $base_img是获取到前端传递的值2 $base_img str_replace(data:image/jpg;base64,, , $base_img);3 // 设…

拷贝构造函数和赋值函数的一些知识
/*******************拷贝构造函数和赋值运算符重载有以下两个不同之处***************************/ 1.拷贝构造函数生成新的类对象,而赋值运算符不能。 2.由于拷贝构造函数是直接构造一个新的类对象,所以在初始化这个对象之前不用检验源对象是否和新对…

代码重构之三种取代类型码(类、子类、状态对象或策略对象)的方式辨析
1.以类取代类型码 适用情况:类之中有一个数值类型码,但它并不影响类的行为。 重构手段:以一个新的类替换该数值类型码。 重构类图示意: 这里的“不影响类的行为”是什么意思呢? 类型码往往和switch语句一起出现&#…

NHibernate之旅(11):探索多对多关系及其关联查询
本节内容 多对多关系引入多对多映射关系多对多关联查询1.原生SQL关联查询2.HQL关联查询3.Criteria API关联查询结语多对多关系引入 让我们再次回顾在第二篇中建立的数据模型: 在图上,我已经清晰的标注了表之间的关系,上两篇分析Customer和Ord…

自动化运维—saltstack
2019独角兽企业重金招聘Python工程师标准>>> 自动化运维——saltstack 、ansible 一、自动化运维介绍 传统运维:传统运维效率低,大多工作需要人工完成,工作繁琐,容易出错,每日重复做相同的事情,…

史上最浅显易懂的Git教程!
Git初学者很好的一篇教程 mark : ) http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000 转载于:https://www.cnblogs.com/anthony0859/p/3900327.html