web是怎么工作的?
URL:https://www.google.com 域名
首先访问最近的DNS服务器 domain name service
DNS记录了这个域名的ip地址是什么
浏览器向该ip地址发送http/https(传输协议)请求。每台服务器/计算机联网都需要一个ip地址。通过ip地址就能找到该服务器/计算机。
服务器收到请求,将请求递交给80端口监听到http server(apache, unicorn, gunicorn, uwsgi)
http server将请求转发给web application(web application framework: Django, Ruby on Rails, Nodejs, Flask)
web application处理请求
-
根据当前路径找到逻辑处理模块
-
根据用户请求(GET + POST)决定如何获取/存放数据
-
从数据存储服务(数据库或者文件系统)中读取数据
-
组织数据成一张html网页作为返回结果
浏览器得到结果展示给用户
浏览器 <--> DNS web server
<--------------> [http server <--> web application] <--> database
浏览器 <--> DNS
<--> firewall <--> load balancer<-->web server <--> database
<-->web server <--> database
async server(message queue) memcache
什么是API? application programming interface
提供一些方法函数功能给别人用,别人通过直接函数调用或者http等方式进行调用,得到了返回结果,这就是API。
api设计
https://www.xx.com/api... 目标获得当前登陆用户在某给某个题的所有提交记录
/api/submissions/?problem_id=1000 #后台用当前用户去筛选
不能带user_id,可以被篡改,别人可以登陆
Restful API, 你要获取的数据是什么,一级目录就是什么。使用HTTP的四个动作(POST,DELETE,GET,PUT)来代表对数据的增删查改
所有的筛选条件,创建参数,都放在http的参数里
Design News Feed API
设计news feed list的web api请求格式
GET https://www.facebook.com/api/newsfeed/
GET https://api.facebook.com/newsfeed/
设计API的返回格式:structured data(json / xml)
返回界面:html
设计翻页pagination:
方法1:/api/newsfeed/?page=1
缺点:如果有新数据被插入,翻到下一页可能会看到上一页的内容
方法2:/api/newsfeed/?max_id=xxx (最新的xxx个,id<=max_id的数据)
如何判断有没有下一页?每次多取一个数据,如果取到,把这个数据作为next_max_id返回给前端
mentions的数据格式?<a href="/users/someone/">@someone</a>
缺点1:需要预防javascript injection attack
缺点2: api无法被mobile端共享
mobile显示链接不用<a>
缺点3:url可能会改动
<user username="someone">Hello World</user>