小白自学代码做app~野路子也有春天(2)

土豆炒青椒
·
·
IPFS
继续走简单粗暴路线

上一期,介绍了小白自学html+css+JavaScript的大方向路线。

按照以往经验,照着W3C school教程自学,再上手练习一下,拿出学习高中数学10%的努力程度,几乎人人都能达到以下水平:

  • 用html标签写一个静态网页;
  • 用css样式给网页某元素换个颜色;
  • 用JavaScript做一个按钮点击响应事件。

靠自学完成以上阶段不算难,但是很多小白自学完html+css+JavaScript后,继续进阶往往遭遇打击。不是因为后面的内容比高中数学难,而是概念比较抽象。如果再遇上一些故弄玄虚的讲解,就会摸不着头脑。但是一旦理解了概念,进阶起来还是比较顺利的。

不過對於新手來說,可能可以加上些試範操作會比較容易了解
——活动版主RitaShields语录

授人以鱼不如授人以渔,代码日新月异,过几个月就有新玩意出现,所以理解原理和概念才是王道。本期响应版主号召,添加一些示范案例。

本期作为小白自学代码做app承前启后篇,介绍API。



第四篇:API

学完JavaScript基本语法和操作后,你可以用JavaScript给网页添加事件、弹出框什么的了……但是有一天网页内容需要更新怎么办呢?难道要去html文件对着改??
这时轮到传说中的API闪亮登场了。


有了API之后,网页涉及的各项内容(文章标题,作者姓名,发布日期……)将不再是纯文字,而是通过应用程序接口(Application Programming Interface:API)获取,大大方便了页面数据跟新以及其他复杂程度。

<!DOCTYPE html>
<html>
<body>
<h1>Summer</h1>
<p>I love the sun!</p>
</body>
</html>

以上是一个简易网页。

简单理解,网页呈现内容“Summer”和“I love the sun!”,目前是通过代码编辑器敲进html文件的。

有了API之后,网页的结构(html)、样式(css)和功能(JavaScript)还是原来的代码,唯一改变的就是网页呈现的内容——通过API获取。

Matters显示的文章也是通过API获取展示的。我们时常在Matters看到一些技术出生的用户发布一些标签榜、排行榜之类的文章。他们怎么知道哪些文章上榜了哪些文章没上榜?答案就是API。

4.1 json

在进阶API之前,我们需要了解一下json。

参考资料:W3C json

{"title":"Summer", "content":"I love the sun!"}

乍一看,json是不是长得和object很像?假如我们有这样一个json文件,我们要想在网页里呈现“夏天”和“我喜欢太阳”,那就需要代码稍微改变一下:

<!DOCTYPE html>
<html>
<body>
<h1></h1>
<p></p>
<script>
const myObj = {"title":"Summer", "content":"I love the sun!"};
document.getElementsByTagName("h1").innerHTML = myObj.title;
document.getElementsByTagName("p").innerHTML = myObj.content;
</script>
</body>
</html>

以上我们实现了内容和代码分离。如果有春夏秋冬4个格式一致的页面,我们只需要一个html模版,内容替换不同的json就好。

了解json在干什么后,我们就明白了Matters那么多文章,是怎么显示出来的了。


4.2 JavaScript API

明白如何实现网页代码内容分离,我们可以进阶——用fetch API获取json,再把json解析呈现在网页里。

这是一个做测试用的假json:https://jsonplaceholder.typicode.com/todos/。我们要想获得第一个title,代码如下:

<!DOCTYPE html>
<html>
<body>
<p id="demo">Fetch a file to change this text.</p>
<script>

let url = "https://jsonplaceholder.typicode.com/todos/"

fetch (url)
.then(res => res.json())
.then(data => document.getElementById("demo").innerHTML = data[0].title);

</script>
</body>
</html>

按钮点击后,发送请求,将第一个用户的title在id为demo的地方展示。


4.3 API 小作业

说了这么多,该做作业了。

https://jsonplaceholder.typicode.com/todos/所有内容(userId、id、title),通过for循环在html页面展示出来。


第五篇:GraphQL

知道什么是API,如何通过API获取数据并呈现网页,你是不是跃跃欲试,也想去玩玩Matters的API,做一个山寨的Matters首页??

根据这篇文章​​社區開放一小步:Matters API,Matters的API已经从REST升级成GraphQL了。所以玩Matters API之前,我们还需要热身一下。

5.1 Postman

继VS Code代码编辑器,Chrome浏览器(浏览器内置inspector)之后,另一个小白进阶工具Postman需要闪亮登场了。

有了Postman,我们可以测试一切API;Postman会成为你进阶路线上的另一个好伙伴。

在做第四篇结尾小作业时,我们使用了GET从服务器端获取数据。如果我们需要表单提交呢?更新网页内容呢?这个时候POST、PUT、DELETE等请求方式闪亮登场。

本着简单粗暴原则,弄懂4个最常用的就行:

GET:从服务器端获取数据,可用于网页呈现内容
POST:向服务器发送数据,例如提交表单
PUT:向服务器更新数据,例如之前post提交的表单发送内容错误,需要修改
DELETE:向服务器删除数据,例如删除某评论


5.2 Matters API

玩转Postman,明白各种get、post之后,我们完成热身可以去玩基于GraphQL的Matters API了。

如果你已经很熟悉REST API的玩法的话,可以直接从5.2玩起。

本着简单粗暴的原则,只要搞懂了概念和原理,你会发现技术更迭升级变化,都是浮云——万变不离其宗。

继续本着简单粗暴原则:

  • REST GET 类似于GraphQL query
  • REST POST、PUT类似于GraphQL mutation

不同的是:

  • 用GraphQL,我们可以按需获取数据
  • GraphQL没有太多endpoint,比如Matters API,搞啥都是它:https://server.matters.news/graphql;如果是REST,完成那么多功能,我们需要多少个??

听不懂在说什么没关系,多玩两遍就懂了。让我们先从Matters playground玩起:https://server.matters.news/playground

如图所示,我们在左边输入一篇文章的hash值,右边就可以获取请求的id、title、summary等数据。

如果我们不需要服务器返回canSuperLike怎么办,很简单,把canSuperLike去掉就好了。

query {
  article (
    input: {
      mediaHash: "bafyreiddie3bbeskhjusm6mrzepbihhp4wq2hhtxtfr6c3eiwjpmps7hqy"
    }) {
    id
    title
    summary
  }
}

这样服务端就只返回id、title和summary了。而在REST中,返回的数据是固定的。


5.3 玩转Matters API 小作业

试着用Matters playground和Postman玩玩article以外的api。

如图所示,我在Postman玩了一下我自己的账号。玩的过程当中,你可能会发现有些参数在非登陆状态是无法获取的。

玩转之后,还是做个作业练习一下:从Matters API获取数据,并显示在网页上。

fetch('https://server.matters.news/graphql', {
  method: 'POST',
  mode: "cors",
  headers: {
    'Content-Type': 'application/json', 
    'Accept': 'application/json'
  },
  credentials: "omit",
  cache: 'no-cache', 
  body: JSON.stringify({
    query: `
    query {
  article (
    input: {
      mediaHash: "bafyreiddie3bbeskhjusm6mrzepbihhp4wq2hhtxtfr6c3eiwjpmps7hqy"
    }) {
    id
    title
    summary
  }
}
      `
  })
})
  .then(function(response) {
    if (response.status === 400) {
        response.json().then(function(object) {
        console.log(object.type, object.message)
        })
    } else if (response.status === 200) {
        response.json().then(function(object) {
            console.log('success');
            console.log(object)
        })
    }
  })


从Matters API获取数据时我遭遇了400 error,使用Matters API对header参数有较严格要求。




总结:

本来想把git也拿来一起放送,结果加入示例代码后,光API就超标了。

总的来说,入门API不算困难。玩着玩着还是很有趣味的。玩转API,我们已经彻底进阶了。

CC BY-NC-ND 2.0 授权

喜欢我的作品吗?别忘了给予支持与赞赏,让我知道在创作的路上有你陪伴,一起延续这份热忱!