在项目中,前端需要与后端的数据进行交互,那么如何在前端项目中连接后端呢?
通常使用的网络(包括互联网)是在 TCP/IP 协议族的基础上运作的。而 HTTP 属于他的一个子集。
HTTP 协议和TCP/IP 协议内的其他众多协议相同,用于客户端和服务器之间的连接。
客户端:请求访问文本或图像等资源的一端
服务器端:提供资源响应的一端
通过之前的新人任务,同学们已经大概的了解了HTTP 协议,这里不再赘述。
下面是一个具体的示例:
POST /Index.htm HTTP/1.1
Accept: */*
Accept-Language: de-at
Referer: http://www.morfik.com/
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; GTB6.3; SLCC1;
.NET CLR 2.0.50727;
Host: www.morfik.com
Content-Length: 0
Connection: Keep-Alive
Pragma: no-cache
Cookie: __utma=57227574.1756966090.1260398203.1260491327.1260491779.5;
[message body]
该请求报文里面主要包括请求访问服务器的类型,称为方法(method),随后字符串 /Index.htm 指明了请求的资源对象,也就是请求 URI(request URI),HTTP/1.1是所使用的协议。
请求报文是由请求方法、请求 URI、协议版本、可选的请求首部字段和内容实体构成。
通过之前的新人任务,同学们已经对 HTTP 有了基本的了解,这里不再赘述,下面简要介绍一下常用的请求方法。
Method | Description |
---|---|
GET | The GET method is used to retrieve information from the given server using a given URI. Requests using GET should only retrieve data and should have no other effect on the data. |
POST | A POST request is used to send data to the server, for example, customer information, file upload, etc. using HTML forms. |
PUT | Replaces all the current representations of the target resource with the uploaded content. |
DELETE | Removes all the current representations of the target resource given by URI. |
响应报文基本上由协议版本、状态码(表示请求成功或失败的数字代码)、用以解释状态码的原因短语、可选的响应首部字段以及实体构成。
HTTP/1.1 200 OK
Cache-Control: no-store
Allow: Post
Content-Type: text/html; charset=utf-8
Content-Encoding: deflate
Last-Modified: Fri, 11 Dec 2009 00:51:37 GMT
Server: Microsoft-IIS/7.0
Content:
Date: Fri, 11 Dec 2009 00:51:37 GMT
Content-Length: 2807
[message body]
Fetch API 提供了一个 JavaScript接口,用于访问和操纵HTTP管道的部分,例如请求和响应。它还提供了一个全局 fetch()方法,该方法提供了一种简单,合乎逻辑的方式来跨网络异步获取资源。
具体使用方法我们来看下MDN文档 使用Fetch
关于什么是异步,可以阅读 Eloquent JavaScript第十一章进一步了解。
在开发中,我们需要根据后端同学写的 API 文档,才知道具体的请求方法和格式。
URL | Header | Method |
---|---|---|
/api/login/ | Content-Type:application/json | POST |
URL Params:None
POST Data(json)
{
'username':string, //用户名
'password':string //用户密码 (base64加密)
}
Return data(json):
{
'token': string
'user_id' : int
}
Status Code
200 OK
403 用户不存在
400 密码错误
在我们的前端代码中:
fetch("/api/login/", {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
username: this.username,
password: btoa(this.passwordInput)
})
}).then(res => {
if (res.ok) {
return res.json()
} else {
this.failed = true
}
}).then(value => {
// do something
})
base64加密,用到的是 btoa()函数,它能够从二进制数据“字符串”创建一个base-64编码的ASCII字符串。,详见Base64 encoding and decoding
Basic 认证(基本认证)是从 HTTP/1.0就定义的认证服务。
认证步骤:
- 客户端发送请求
- 服务器端 返回状态码401以告知客户端需要认证
- 用户名 ID 和密码base64 方式编码发送
- 认证成功则返回200,失败返回401
第三步中发送的字符串内容是由用户 ID 和密码构成,两者中间以冒号(:)连接,再经过 base64编码加密,写入 header 字段 Authorization 里,发送请求。
fetch("/api/login/", {
method: 'GET',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/x-www-form-unlencoded',
'Authorization': 'Basic ' + btoa(this.emailInput + ':' + this.passwordInput)
// 注意 Basic 后面有个空格
}
})
在团队的项目中,我们其实不推荐这样写请求代码。因为我们常常需要拉取数据,在发送请求的一些代码需要重复的编写。所以在今后的所有项目中,我们要求集中管理这些请求的路由并处理错误。详细参考简单的前端网络层Service封装
Postman 介绍:
有兴趣的同学可以用 Postman 把玩 Github API,调用API执行一些简单的操作
以上就是我们前端开发中与后端交互的基础知识介绍和简易流程,在实际开发过程中同学们会有更加清晰的了解。
推荐阅读: