日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

koa --- restful规范及其栗子

發(fā)布時(shí)間:2023/12/10 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 koa --- restful规范及其栗子 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

遵循Restful規(guī)范的簡(jiǎn)單的栗子

  • 前端代碼:
<html><head><script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script><script src="https://unpkg.com/element-ui/lib/index.js"></script><script src="https://unpkg.com/axios/dist/axios.min.js"></script><link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css" /></head><body><div id="app"><div style="display: flex;flex-direction: column;"><el-input v-model="form.name" autocomplete="off" placeholder="姓名" style=""></el-input><el-button v-on:click="get">GET</el-button><el-button v-on:click="post">POST</el-button><el-button v-on:click="del">DELETE</el-button><el-button v-on:click="put">PUT</el-button><el-button v-on:click="logs=[]">Clear Log</el-button></div><!-- 日志部分 --><ul><li v-for="(log, idx) in logs" :key="idx">{{log}}</li></ul></div><script>axios.defaults.baseURL = "http://localhost:3000";axios.interceptors.response.use(response => {app.logs.push(JSON.stringify(response.data));return response;},err => {app.logs.push(JSON.stringify(response.data));return Promise.reject(err);})var app = new Vue({el: '#app',data: {form: {name: 'marron',id: 3},logs: []},methods: {async post() {const res = await axios.post("/users", this.form);},async get() {const res = await axios.get("/users");},async put() {const res = await axios.put("/users", this.form);},async del() {const res = await axios.delete("/users/3");}}})</script> </body></html>
  • 后端代碼
const Koa = require("koa"); const app = new Koa(); const Router = require("koa-router"); const router = new Router({ prefix: "/users" }); const cors = require("koa2-cors"); const bodyParser = require("koa-bodyparser"); app.use(cors()); app.use(bodyParser());const users = [{id:1 , name:"tom"}, {id:2, name: "jerry"}];// 查找數(shù)據(jù) ?name = xx router.get("/", ctx =>{console.log("GET /users");const {name} = ctx.query; // ?name = xxlet data = users;if (name) {data = users.filter (u => u.name === name);}ctx.body = {ok: 1, data}; });// 查找數(shù)據(jù) /users/1 id = 1 router.get("/:id", ctx =>{console.log("GET /users/:id");const {id} = ctx.params; // /users/1const data = users.find(u => u.id == id);ctx.body = {ok:1 , data}; });// 新增用戶 router.post("/", ctx=>{console.log("POST /users");const {body: user} = ctx.request; // 請(qǐng)求bodyuser.id = users.length +1;users.push(user);ctx.body = { ok: 1}; });router.put("/", ctx => {console.log("PUT /users");const {body: user} = ctx.request; // 請(qǐng)求bodyconst idx = users.findIndex(u => u.id == user.id);if(idx > -1){users[idx] = user;}ctx.body = { ok: 1}; });// 刪除用戶 /users/1 刪除id為1 router.delete("/:id", ctx =>{console.log("DELETE /users/:id");const {id} = ctx.params;const idx = users.findIndex(u => u.id === id);if( idx > -1){users.splice(idx, 1);}ctx.body ={ ok: 1}; });app.use(router.routes()); app.listen(3000, ()=>{console.log("[Server] Server is running at http://localhost:3000"); })

Restful規(guī)范幾個(gè)注意:

  • 動(dòng)賓結(jié)構(gòu)
    客戶端發(fā)出的指令都是"動(dòng)詞 + 賓語(yǔ)"的結(jié)構(gòu),如: “GET / articles”
  • 動(dòng)詞的覆蓋
    可以使用 X-HTTP-Method-Override屬性告訴服務(wù)器使用哪一個(gè)動(dòng)詞覆蓋POST方法
  • POST /api/marron/1 HTTP/1.1 X-HTTP-Method-Override: PUT

    上面指明了PUT方法.
    在服務(wù)器端(koa2)使用下面方法接受

    router.put("/api/marron:id", async ctx=>{ })
  • 賓語(yǔ)必須是名詞,且盡量為復(fù)數(shù)
    不要出現(xiàn)/getnames 或 /name之類的,盡量使用 /names
  • 盡量扁平化
    不要出現(xiàn)GET /authors/12/categories/2 ,如果可以,盡量使用GET /authors/12?categories=2
  • 總結(jié)

    以上是生活随笔為你收集整理的koa --- restful规范及其栗子的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。