[{"data":1,"prerenderedAt":201},["ShallowReactive",2],{"content:\u002Fposts\u002F2024\u002Fnest-restful-api-design":3,"surround:\u002Fposts\u002F2024\u002Fnest-restful-api-design":190},{"id":4,"title":5,"body":6,"canonical":166,"categories":167,"date":169,"description":166,"draft":170,"extension":171,"image":172,"meta":173,"navigation":174,"path":175,"permalink":166,"readingTime":176,"recommend":166,"references":181,"seo":185,"sitemap":186,"stem":187,"tags":188,"type":166,"updated":169,"__hash__":189},"content\u002Fposts\u002F2024\u002Fnest-restful-api-design.md","RESTful 风格设计",{"type":7,"value":8,"toc":152},"minimark",[9,14,18,22,28,31,34,37,42,96,99,103,106,109,131,134,137,140,146,149],[10,11,13],"h2",{"id":12},"为什么要使用-restful-架构","为什么要使用 RESTful 架构？",[15,16,17],"p",{},"RESTful 可以充分利用 HTTP 协议的各种功能，可以让接口设计更加清晰、简洁、富有层次，可维护性更好。",[10,19,21],{"id":20},"api-设计风格","API 设计风格",[15,23,24],{},[25,26,27],"strong",{},"请求 = 动词 + 宾语",[15,29,30],{},"动词：使用 HTTP 的 5 种方法，对应 CRUD 操作",[15,32,33],{},"宾语： URL 应该全部使用名词复数，可以有例外，比如搜索可以使用更加直观的 search 。",[15,35,36],{},"过滤信息（Filtering）： 如果记录数量很多，API 应该提供参数，过滤返回结果。 ?limit=10 指定返回记录的数量 ?offset=10 指定返回记录的开始位置。",[38,39,41],"h3",{"id":40},"示例一个用户的操作","示例：一个用户的操作",[43,44,45,57,66,74,81,88],"ul",{},[46,47,48,49,53,54],"li",{},"添加用户: ",[50,51,52],"code",{"code":52},"GET"," ",[50,55,56],{"code":56},"\u002Fapi\u002Fusers",[46,58,59,60,53,63],{},"编辑用户(更新该用户全部数据): ",[50,61,62],{"code":62},"PUT",[50,64,65],{"code":65},"\u002Fapi\u002Fusers\u002F1",[46,67,68,69,53,72],{},"编辑用户(更新用户部分数据): ",[50,70,71],{"code":71},"PATCH",[50,73,65],{"code":65},[46,75,76,77,53,79],{},"查询用户列表: ",[50,78,52],{"code":52},[50,80,56],{"code":56},[46,82,83,84,53,86],{},"查询单个用户: ",[50,85,52],{"code":52},[50,87,65],{"code":65},[46,89,90,91,53,94],{},"删除用户: ",[50,92,93],{"code":93},"DELETE",[50,95,65],{"code":65},[10,97,98],{"id":98},"响应设计",[38,100,102],{"id":101},"http-状态码使用","HTTP 状态码使用",[15,104,105],{},"客户端的每一次请求，服务器都必须给出回应。回应包括 HTTP 状态码和数据两部分。",[15,107,108],{},"使用 不同的 HTTP 状态码表示不同类型的响应。每一种状态码都有约定的解释，客户端只需查看状态码，就可以判断出发生了什么情况。",[43,110,111,126],{},[46,112,113,53,116,53,119,53,122,125],{},[50,114,115],{"code":115},"2xx",[50,117,118],{"code":118},"3xx",[50,120,121],{"code":121},"4xx",[50,123,124],{"code":124},"403"," 无权限",[46,127,128],{},[50,129,130],{"code":130},"5xx",[38,132,133],{"id":133},"服务端数据响应",[15,135,136],{},"客户端请求时，要明确告诉服务器，接受 JSON 格式，请求的 HTTP 头的 ACCEPT 属性要设成 application\u002Fjson",[15,138,139],{},"服务端响应的数据不应该是纯文本，而应该是一个 JSON 对象。服务器回应的 HTTP 头的 Content-Type 属性要设为 application\u002Fjson",[15,141,142,143],{},"错误处理 如果状态码是 4xx，就应该向用户返回出错信息。一般来说，返回的信息中将 error 作为键名，出错信息作为键值即可。 ",[50,144,145],{"code":145},"{error: \"Invalid API key\"}",[15,147,148],{},"认证 RESTful API 应该是无状态，每个请求应该带有一些认证凭证。推荐使用 JWT 认证，并且使用 SSL",[15,150,151],{},"Hypermedia 即返回结果中提供链接，连向其他 API 方法，使得用户不查文档，也知道下一步应该做什么",{"title":153,"searchDepth":154,"depth":154,"links":155},"",4,[156,158,162],{"id":12,"depth":157,"text":13},2,{"id":20,"depth":157,"text":21,"children":159},[160],{"id":40,"depth":161,"text":41},3,{"id":98,"depth":157,"text":98,"children":163},[164,165],{"id":101,"depth":161,"text":102},{"id":133,"depth":161,"text":133},null,[168],"代码","2024-01-20 22:56:21",false,"md","https:\u002F\u002Fbitmc.uno\u002Fpicgo\u002F67a18aa6d38a0-78.webp",{},true,"\u002Fposts\u002F2024\u002Fnest-restful-api-design",{"text":177,"minutes":178,"time":179,"words":180},"3 min read",2.54,152400,508,[182],{"title":183,"link":184},"RESTful API","https:\u002F\u002Frestfulapi.cn\u002F",{"title":5,"description":166},{"loc":175},"posts\u002F2024\u002Fnest-restful-api-design",[],"aEv_36o1gRht0MucI8LlJ030t9j0k0R7QrQIypROLJM",[191,196],{"title":192,"path":193,"stem":194,"date":195,"type":166,"children":-1},"为您的stellar添加medium-zoom","\u002Fposts\u002F2024\u002Fstellar-theme-add-medium-zoom","posts\u002F2024\u002Fstellar-theme-add-medium-zoom","2024-01-14 14:41:05",{"title":197,"path":198,"stem":199,"date":200,"type":166,"children":-1},"控制反转和依赖注入","\u002Fposts\u002F2024\u002Fnest-ioc-di","posts\u002F2024\u002Fnest-ioc-di","2024-01-21 16:35:14",1789642592976]