1import{_ as a,c as n,b as s,a as e,o as i}from"./app-B8MQJI6s.js";const l={};function d(r,t){return i(),n("div",null,t[0]||(t[0]=[s(`<p>å¦ææ²¡æ¶é´çï¼è®°ä½3ç¹</p><ul><li><p>RESTä»¥èµæºä¸ºä¸å¿è®¾è®¡çAPIï¼æ°æ®æ¶æåæ°æ®æ¨¡å设计对RESTæ¥å£è´¨éæå¾å¤§å½±å</p></li><li><p>éäºä¸å³å°±ç¨POST</p></li><li><p>åèä¸ççREST APIï¼å¦githubï¼elasticsearch</p></li></ul><h2 id="rest-èæ¯" tabindex="-1"><a class="header-anchor" href="#rest-èæ¯"><span>REST èæ¯</span></a></h2><p>2000å¹´ï¼äºèç½å ´èµ·æ°å¹´ï¼ä¼ä¸ç³»ç»å¹¿æ³æµè¡éè¿HTTP å®ç°è¿ç¨è°ç¨ï¼ä»£æ¿EJBï¼å½æ¶åºäºHTTPè¿ç¨è°ç¨ï¼æ 论URLç设计ï¼åæ°å½åï¼ä»¥åååºé½æ²¡æç»ä¸çè§èãRoy Fielding é对æ¤é®é¢ï¼ æåºäºè¡¨ç¤ºç¶æè½¬ç§»ï¼Representational State Transferï¼ï¼ç®ç§°RESTï¼ä½ä¸ºä¸ç§è®¾è®¡webæå¡çä½ç³»ç»ææ¹æ³ .<a href="http://www.ruanyifeng.com/blog/2011/09/restful.html" target="_blank" rel="noopener noreferrer">REST</a> æ¯ç®åææµè¡çHTTP API 设计è§èï¼ç¨äº Web æ¥å£ç设计 ã</p><p>RESTçæ ¸å¿ææ³å°±æ¯ï¼å®¢æ·ç«¯ååºçæä»¤é½æ¯"æ åå¨è¯ + æä½èµæº"çç»æãæ¯å¦ï¼<code>GET /orders</code>/1è¿ä¸ªå½ä»¤ï¼<code>GET</code>æ¯å¨è¯ï¼<code>/orders</code>/1 æ¯å®¾è¯,è¿éç1æ¯æè®¢åç¼å·ä¸º1ç订åã</p><p>å¦ä¸æ¯ä¸ä¸ªREST请æ±</p><div class="language-http line-numbers-mode" data-ext="http" data-title="http"><button class="copy" title="Copy code" data-copied="Copied"></button><pre class="shiki shiki-themes vitesse-light vitesse-dark vp-code"><code><span class="line"><span>GET https://xxxx/orders/1 HTTP/1.1</span></span> 2<span class="line"><span>Accept: application/json</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div></div></div><p>ååº</p><div class="language-http line-numbers-mode" data-ext="http" data-title="http"><button class="copy" title="Copy code" data-copied="Copied"></button><pre class="shiki shiki-themes vitesse-light vitesse-dark vp-code"><code><span class="line"><span>HTTP/1.1 200 OK</span></span> 3<span class="line"><span></span></span> 4<span class="line"><span>{</span></span> 5<span class="line"><span>"code":"SUCCESS"</span></span> 6<span class="line"><span>"messsage":"æå"</span></span> 7<span class="line"><span>"data":{"orderId":1,"orderValue":99.90,"productId":1,"quantity":1}</span></span> 8<span class="line"><span>}</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>è¿éçæ åå¨è¯æ¯HTTPè§èæä¾çæ åï¼å¦ä¸é¢çgetï¼å ¶ä»å¨ä½è¿æpost,delete,å°ä¼å¨åé¢æè¿°ã</p><p>ç¸æ¯äºHTTP è¿ç¨è°ç¨ï¼RESTæ¯ä»¥èµæºä½ä¸å¿æå»ºçè¿ç¨è°ç¨æå¡ï¼è¿éçèµæºæçæ¯ä¸å¡å®ä½ï¼ä¸å¡å®ä½æ¥èªäºæ°æ®æ¶æãä¸ä¸ªè¯å¥½çREST API设计ï¼ç¦»ä¸å¼è¯å¥½çæ°æ®æ¶æ</p><p>以GIT æä¾çæå¡ä¸ºä¾åï¼èµæºå æ¬äº</p><ul><li>ä»åº</li><li>ç¨æ·</li><li>Issues</li><li>Release</li><li>Team</li></ul><p>以ç©èç½ä¸ºä¾åï¼èµæºå æ¬äº</p><ul><li>设å¤</li><li>ç¨æ·</li><li>å®¶åº</li><li>屿§</li><li>åè¦</li><li>OTA</li><li>å½ä»¤</li></ul><h2 id="reståå ¶ä»å议对æ¯" tabindex="-1"><a class="header-anchor" href="#reståå ¶ä»å议对æ¯"><span>RESTåå ¶ä»å议对æ¯</span></a></h2><p>å¨ä¸ä¸èï¼æ¯è¾è¿äºè¿å¶åè®®åHTTPçåºå«ï¼å»ºç«å¨HTTPä¹ä¸çRESTï¼å ·å¤HTTPçä¼ç¹</p><ul><li>è¯è¨ç¬ç«ï¼ ææè¯è¨é½æ¯æHTTPåè®®ï¼ä¹æä¾REST飿 ¼ç客æ·ç«¯æ¥å£</li><li>å¹³å°ç¬ç«: ææçç³»ç»é½æ¯æHTTP</li><li>å¯è§æµæ§å¼º: éè¿HTTP代çæå¡å¨ï¼ä»¥åè¯å¥½çRESTæ¥å£å®ä¹ï¼å¯ä»¥è®©ç³»ç»ä¹é´è°ç¨å¯è§æµï¼
8å¯ç»è®¡</li></ul><p>åºäºHTTPåè®®çé¤äºRESTå¤ï¼è¿æé常æµè¡çSOAPï¼ç®ååºåä¿©ç§çåºå«</p><table><thead><tr><th></th><th>REST</th><th>SOAP</th></tr></thead><tbody><tr><td>æ ¸å¿</td><td>èµæº</td><td>æå¡ï¼æ¹æ³ï¼ï¼åä¼ ç»åå¸å¼è°ç¨Corbaï¼EJBççHTTPçæ¬</td></tr><tr><td>é级</td><td>轻便ï¼å¯é约æ</td><td>éé级ï¼å¿
须约æ</td></tr><tr><td>éç¨èå´</td><td>ä»»ä½ç³»ç»ï¼æå¡ä¹é´ï¼ç»ç«¯åç³»ç»ä¹é´</td><td>ç³»ç»ä¹é´ï¼å¦äººåç³»ç»åè´¢å¡ç³»ç»</td></tr></tbody></table><h2 id="restæä½³å®è·µ" tabindex="-1"><a class="header-anchor" href="#restæä½³å®è·µ"><span>RESTæä½³å®è·µ</span></a></h2><p>æ¬èä»ç»RESTç设计æä½³å®è·µï¼å®é¤äºä¸ä¸èçåå¸å¼APIéç¨çæä½³å®è·µå¤ï¼REST API è¿æ ç¹å®ç设计ååï¼æ»ç»ä¸ºä¸è¡¨å
容å表åçéç¹è¯´æ</p><table><thead><tr><th>设计åå</th><th>æè¿°</th></tr></thead><tbody><tr><td>URL</td><td>URLå¿
é¡»å®ä¹äºèµæºï¼æ¯å¦/books/1978</td></tr><tr><td>å½åè§è</td><td>驼峰å½åæ¹æ³ï¼èå½¢å½åæ³ï¼ç¤è串å½åæ³ãæ¯å¦å¯¹äºæ¾ç¤ºåç§° display nameãåå«å¯¹åºäºdisplayNameï¼display_name, dispaly-nameã RESTçURLé常使ç¨ç¤è串å½åæ³ï¼å
¥åååºåæ°ä½¿ç¨Java常ç¨ç驼峰å½åæ³</td></tr><tr><td>èµæºåç§°</td><td>APIçæ ¸å¿æ¯æä½æ¯WEBèµæºæè
ä¸å¡å®ä½ï¼å æ¤éè¦å¨è¿ä¹åå®ä¹å¥½è¿äºåç§°ï¼è¿äºåç§°å¨æ°æ®æ¶ææè
æ´æ©ççæ°æ®æ¶æåå·²ç»å®å¥½ãæ¯å¦ç¨æ·ä¸å¿æä¾çRESTæ¥å£æ¥è¯¢ç¨æ·çç»å®è®¾å¤GET /users/devices ãå¦æç¼ºå°æ ååç§°ï¼å¦å¤ä¸ä¸ªæ¥å£æ¥è¯¢è®¾å¤ç¶æ GET /devs/customer . è¿è®©API使ç¨è
æå°æ,ä»å¯è½è®¤ä¸ºdevicesådevs å¯è½æ¯ç©èç½çä¿©ç§è®¾å¤èµæºåç§°é叏以夿°å½¢å¼ä½ç°</td></tr><tr><td>èµæºå±çº§</td><td>å½èµæºå¿
é¡»éè¿å±çº§è·åçæ¶åï¼å¯ä»¥ç¨/表达å±çº§ï¼æ¯å¦/orders/{orderId}/itemsï¼ å»ºè®®å±çº§ä¸è¶
è¿3å±ã</td></tr><tr><td>æ ååæ®µ</td><td>å®ä¹å¸¸è§çæ ååæ®µï¼å¦requestIdï¼tokenï¼createTime,orderBy,displayName,startDate,endDateç. å
¶ä»è¡ä¸ç¹å®çåæ®µåºè¯¥åºäºæ°æ®æ¶æçæ¦å¿µæ¨¡åæ¥å®ä¹ï¼æ¯å¦ç©èç½ä¸çdeviceï¼shadow, çµåä¸çcouponï¼orderï¼sku</td></tr><tr><td>å¼éåºé´</td><td>表示èå´ï¼éè¦ç»ä¸è§å®æ¯å¦å
å«ä¸´çå¼ï¼Javaé常使ç¨[ã)ï¼èµ·å§å¼éåºé´ï¼ç»æå¼ä¸ºå¼åºé´,æ¨è使ç¨è¿ç§çº¦å®</td></tr><tr><td>使ç¨åä½åç¼</td><td>æ¯å¦ä¼å
使ç¨maxByte代æ¿maxï¼é¤éæä¸ä¸ææç¤ºè¿åçåä½ã å
³äºæ¶é´ï¼ç²¾ç¡®å°ç§ï¼åºè¯¥ä½¿ç¨timeï¼ç²¾ç¡®å°å¤©ï¼åºè¯¥ä½¿ç¨dateåç¼ã</td></tr><tr><td>åå缩å</td><td>软件å¼åè
常ç¨ç缩åå¯ä»¥ç¨å¨APIä¸ï¼å¦idï¼configï¼çµåä¸çSkuã</td></tr><tr><td>屿§</td><td>classæ¯javaçå
³é®åï¼å æ¤å¨è®¾è®¡APIçæ¶åéè¦é¿å
åæ°ä¸ä½¿ç¨æ¤å
³é®åï¼è¿ä¸»è¦èèå°åºåååååºååæ¶åï¼è¿ç±»å
³é®åæ æ³è¢«å®ç°ï¼ iså¼å¤´ç屿§æå¯è½å¨ååºååä¸å¤±è´¥: isCreate,æçåºååæisCreate,æçåºååæcreate ï¼éè¦æç¡®å±æ§ä¸åå¨å屿§å¼ä¸ºnullæ¯åä¸ä¸ªå«ä¹ æç¡®ç©ºéåånullæ¯åä¸ä¸ªå«ä¹ ï¼å®¢æ·ç«¯æ¯å¦æ¯ææµ®ç¹æ°ï¼ä»¥JS为ä¾åï¼<a href="https://blog.csdn.net/u010028869/article/details/86563382" target="_blank" rel="noopener noreferrer">䏿¯æJavaè¿åçè¿é¿çæ°å</a></td></tr><tr><td>çæ¬å·</td><td>é常使ç¨version表示apiççæ¬ï¼æ¯å¦/gms/v1.0/devicesï¼å»ºè®®REST URL æ»æ¯å
å«versionãå¦å¤å¯éçæ¯å¨HTTP Headerä¸å
å«versionãæ¯å¦github apiæ¨èæversionæ¾å°headeré</td></tr></tbody></table><p>ä¸è¡¨ååºäº <a href="https://docs.github.com/en/rest/repos/repos?apiVersion=2022-11-28#list-repositories-for-the-authenticated-user" target="_blank" rel="noopener noreferrer">Github REST API</a></p>`,24),e("table",null,[e("thead",null,[e("tr",null,[e("th",null,"RESTæ¥å£"),e("th",null,"说æ")])]),e("tbody",null,[e("tr",null,[e("td",null,"/user/repos"),e("td",null,"è·åå½åç¨æ·çææä»åº")]),e("tr",null,[e("td",{repo:""},"/repos/{owner}/"),e("td",null,"æ¥è¯¢ä¸ä¸ªä»åºä¿¡æ¯")]),e("tr",null,[e("td",null,"/repos/{owner}/{repo}/releases"),e("td",null,"æ¥èªgithub apiï¼è¿å代ç åºçæærelease")]),e("tr",null,[e("td",{release_id:""},"/repos/{owner}/{repo}/releases/"),e("td",null,"æ¥èªgithub apiï¼è¿å代ç åºçæå®çrelease ä¿¡æ¯")])])],-1),s(`<p>ä¸åæ
嵿¯é误çURLä¾å</p><table><thead><tr><th>
8RESTæ¥å£</th><th>æ£ç¡®</th><th>é误åæ</th></tr></thead><tbody><tr><td>/book</td><td>/books</td><td>é常使ç¨å¤æ°ï¼é¤éæ¥è¯¢å个对象</td></tr><tr><td>/user/create</td><td>/user</td><td>URL ä¸åºè¯¥å å«å¨è¯</td></tr><tr><td>/users/{id}/books.json</td><td>/users/{id}/books</td><td>æ éæå®è¿åçæ ¼å¼ï¼é常é»è®¤æ¯jsonï¼å¦æéè¦å ¶ä»æ ¼å¼ï¼å¯ä»¥éè¿åªä½ç±»åæ¥æå®ï¼æ¯å¦<strong>application/xml</strong></td></tr><tr><td></td><td></td><td></td></tr></tbody></table><p>æèï¼æ¥çä½ ç³»ç»ççREST APIï¼ççææ²¡æä¸ç¬¦åRESTAPI 设计ååç</p><p><strong>æ åæ¹æ³å½å</strong></p><p>HTTPæä¾äºæ åçå¨ä½ GET,PUT,POST,DELETEç,</p><ul><li>GETï¼è¯»å</li><li>POSTï¼æ°å»º</li><li>PUTï¼å建æè æ´æ°</li><li>PATCHï¼æ´æ°ï¼Updateï¼ï¼é常æ¯é¨åæ´æ°</li><li>DELETEï¼å é¤ï¼Deleteï¼</li></ul><table><thead><tr><th>URL</th><th>å¨ä½</th><th>å«ä¹</th></tr></thead><tbody><tr><td>/users</td><td>GET</td><td>æ¥è¯¢ææç¨æ·</td></tr><tr><td>/users/1</td><td>GET</td><td>æ¥è¯¢id为1çç¨æ·</td></tr><tr><td>/users</td><td>POST</td><td>å建æ°çç¨æ·</td></tr><tr><td>/users/1</td><td>PUT</td><td>å建æè æ´æ°ç¨æ·ï¼id为1</td></tr><tr><td>/users/1</td><td>DELETE</td><td>å é¤ç¨æ·1</td></tr><tr><td>/users</td><td>DELETE</td><td>å 餿æç¨æ·</td></tr></tbody></table><p><strong>èå´æ¥è¯¢</strong></p><p>è§å®ä½¿ç¨offsetålimtä½ä¸ºæ¥è¯¢åæ°ï¼å¦ææ°æ®æ¥æºæ¯å¤§æ°æ®ï¼é常使ç¨cusoræ¹å¼æ¥è¯¢ï¼ç¿»é¡µèå´ä½¿ç¨cusorålimitåæ°ä¿©ä¸ªï¼è¿éçcusoré常æ¯éå¢ä¸»é®id</p><p><strong>HTTP</strong> <strong>Stauts</strong></p><p>å¨å¼åAPIæ¶åï¼å¯¹äºRESTçååºç»æï¼è¿éè¦è¿ä¸æ¥è§èå¦ä¸API说æï¼é常ç¨å¦ä¸</p><ul><li>200 表示æå</li><li>400 表示客æ·ç«¯é误 <ul><li>400 æå¡å¨ä¸ç解请æ±ï¼å¦åæ°é误</li><li>401 æªéè¿èº«ä»½éªè¯</li><li>403 æªææç访é®èµæº</li><li>404 访é®èµæºä¸åå¨</li></ul></li><li>500 表示æå¡ç«¯é误</li></ul><p>å ³äºHTTP Status å®ä¹ï¼åè<a href="https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Status" target="_blank" rel="noopener noreferrer">HTTP ååºç¶æ</a></p><p>妿è¿äºStatus Codeä¸è¶³ä»¥è¡¨è¾¾æ´æç¡®çå«ä¹ï¼å»ºè®®å¨ååºä½çJSONéå å«code è¿ä¸æ¥æç¡®é误å«ä¹ï¼æ¯å¦code为PARAMETER_ERROR è¡¨ç¤ºåæ°æ ¡éªé误ãmessageé常ç¨äºè¡¥å codeå«ä¹</p><div class="language-http line-numbers-mode" data-ext="http" data-title="http"><button class="copy" title="Copy code" data-copied="Copied"></button><pre class="shiki shiki-themes vitesse-light vitesse-dark vp-code"><code><span class="line"><span>HTTP/1.1 200 OK</span></span> 9<span class="line"><span>Content-Type: application/json</span></span> 10<span class="line"><span></span></span> 11<span class="line"><span>{</span></span> 12<span class="line"><span>"code":"SUCCESS"</span></span> 13<span class="line"><span>"messsage":"åºåæ¥è¯¢æå"</span></span> 14<span class="line"><span>"data":{</span></span> 15<span class="line"><span> </span></span> 16<span class="line"><span>}</span></span> 17<span class="line"><span>}</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>é误ååº: 对äºåºäºHTTPåè®®çAPIï¼å¯ä»¥å åå©ç¨HTTP STATUSæ¥è¡¨ç¤ºAPIæ¯å¦æåï¼STATUS 304 表示ææéï¼STATUS 500 表示å é¨å¤±è´¥ï¼ççï¼ä½¿ç¨HTTP STATUS乿å©äºå ¶ä»ç³»ç»,å¦ç½å ³æè çæ§ç³»ç»å¯¹é误è¿è¡è§æµã</p><div class="language-http line-numbers-mode" data-ext="http" data-title="http"><button class="copy" title="Copy code" data-copied="Copied"></button><pre class="shiki shiki-themes vitesse-light vitesse-dark vp-code"><code><span class="line"><span>HTTP/1.1 500 ï¼</span></span> 18<span class="line"><span>Content-Type: application/json</span></span> 19<span class="line"><span></span></span> 20<span class="line"><span>{</span></span> 21<span class="line"><span>"code":"PARAMETER_ERROR"</span></span> 22<span class="line"><span>"messsage":"æä½å¤±è´¥ï¼"</span></span> 23<span class="line"><span>"data":{</span></span> 24<span class="line"><span> </span></span> 25<span class="line"><span>}</span></span> 26<span class="line"><span>}</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>使ç¨HTTP Statusï¼è¿æ¯ä½¿ç¨ååºçBodyä¸çcodeæ¥æç¤ºRESTçååºç»æï¼å±å± äºä¿©ä¸ªå ç´ </p><p>1ï¼ HTTP Statusä»ç¶è½ç²ç¥ç表达REST ååºç¶æï¼å±å± äºå®¢æ·ç«¯æ¯å¦å¯¹ç¶ææ´è¯¦ç»çè¦æ±ï¼æ¯å¦HTTP 500表示æå¡å¨å ä¸é误ï¼
26对äºå¤§å¤æ°çµååä¼ä¸åºç¨ç³»ç»ï¼æ¯ä¸è¶³ä»¥è¡¨è¾¾ç</p><p>1ï¼ å¯è§æµæ§ï¼å¦æå·²ç»æå»ºå¥½çæå¯è§æµç³»ç»ï¼ä¸RESTè¿åç»æè½è¢«å®¢è§æ§ç³»ç»æ¶éå°ï¼åå¯ä»¥ä½¿ç¨CODEæ¥æç¤ºç»æã å¦ææ¤æ¶æå»ºçæNGINX çæ¥å¿çæ§ï¼HTTP Statusä¹è½ç²ç¥çç»è®¡å°REST 请æ±ç»æ</p><p>妿APIå®ç°å¼æ¥è°ç¨ï¼éè¦éè¿ææ¡£åè°ç¨è 说æï¼ä»åªéå¯ä»¥è·å弿¥æ§è¡ç»æãæè æä¾ä¸ä¸ªæ°çAPIï¼ç¨æ·å¯ä»¥éè¿reqeust_idï¼æ¥è¯¢å¼æ¥è°ç¨ç»æãæè æå¡ç«¯è¿åä¸ä¸ªæ¥è¯¢IDï¼ç¨æ·å¯ä»¥ç¨æ¤IDæ¥è¯¢ç»æ</p><p>æè 对äºREST请æ±ï¼ä¹å¯ä»¥å¨ååºä¸å å«ä¸ä¸ªURLï¼ä¾ç¨æ·æ¥è¯¢ãå¦ä¸ä¸ä¸ªæåååº</p><div class="language-http line-numbers-mode" data-ext="http" data-title="http"><button class="copy" title="Copy code" data-copied="Copied"></button><pre class="shiki shiki-themes vitesse-light vitesse-dark vp-code"><code><span class="line"><span>HTTP/1.1 200 OK</span></span> 27<span class="line"><span>Content-Type: application/json</span></span> 28<span class="line"><span></span></span> 29<span class="line"><span>{</span></span> 30<span class="line"><span>"code":"ASYNC-SUCCESS"</span></span> 31<span class="line"><span>"messsage":"æå"</span></span> 32<span class="line"><span>"data":{</span></span> 33<span class="line"><span> "url":"/device/ECD0017R1/status/344fer55656563"</span></span> 34<span class="line"><span>}</span></span> 35<span class="line"><span>}</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>æ è®ºæ¯æåæè 失败ï¼é½åºè¯¥å å«codeåmessageï¼codeæ¯æåæè é误çCODEå®ä¹ï¼messageæ¯ç¨æ·å¯é 读ççæ¶æ¯ã</p><p>对äºååºçJSONï¼è¿æå¦ä¸è®¾è®¡å»ºè®®</p><ul><li>éè¦æç¡®çåºåå ¶å±æ§æ¯å¦ä¸ºnullï¼æè ä¸åå¨</li><li>è¿åç空éåï¼ä½¿ç¨[],è䏿¯nullï¼æè ä¸åå¨</li><li>è¿åçæµ®ç¹æ°æè é¿æ´å½¢ï¼å¦æå®¢æ·ç«¯æ¯JSï¼éè¦æ³¨æå°æå¯è½JS䏿¯æï¼è¿æ åµä¸æ¹æå符串</li></ul><h2 id="æ»æä¾å¤" tabindex="-1"><a class="header-anchor" href="#æ»æä¾å¤"><span>æ»æä¾å¤</span></a></h2><p>æ¬èå å«äºé常REST API æä½³å®è·µï¼æå ¶ä»èµæå¯¹API æä½³å®è·µææ´ä¸¥æ ¼çè§å®ï¼æ¶æå¸éè¦è¡¡éæ¯å¦éç¨è¿äºä¸¥æ ¼è§å®, æ¬æå举äºå 个éè¦è¡¡éçç¹</p><ul><li>å å使ç¨HTTP Status Codeï¼æäºRESTè§èè¦æ±ä½¿ç¨æ´å¤çHTTP Status Codeè¡¨ç¤ºï¼æ¯å¦å¯¹äºå®¢æ·ç«¯é误ï¼éç¨403表示æéä¸è¶³ï¼ï¼404表示访é®èµæºä¸åå¨ä½¿ç¨ãåèrfc9110 äºè§£æ´å¤statuså«ä¹ãæ¬ä¹¦å»ºè®®ä½¿ç¨200ï¼400ï¼ä»¥å500å³å¯ï¼æ´è¯¦ç»çéè¯¯ä¿¡æ¯æ¾å¨codeé</li><li>REST APIçGETæ¥è¯¢ä¸æ¨èæºå¸¦Bodyãå 许GET with Body,å³å 许GETæ¥è¯¢æºå¸¦Bodyãè¿æ¯å 为å¯è½æ¥è¯¢åæ°ç»æè¾ä¸ºå¤æï¼æ¯å¦ESæä¾ç/_search, å ¶bodyå°±æ¯ä¸ä¸ªJSONæ ¼å¼ã忝å¦ï¼é常客æ·ç«¯JSæ¡æ¶ä¼æé¡µé¢æ¥è¯¢æ¡ä»¶ç表ååºååæJSONãå æ¤é常建议使ç¨POST请æ±ï¼ä¸URLè·¯å¾ä¸å¢å æ¥è¯¢å¨ä½ï¼æ¯å¦/books/search</li><li>å é¤é常æ¯ç¨DELETEï¼å¦ææ¯æç §æ¡ä»¶å é¤ï¼å¯ä»¥ä½¿ç¨POSTï¼æ¯å¦ESä¸çæç §æ¥è¯¢æ¡ä»¶å é¤ POST /my-index-000001/_delete_by_query</li><li>REST API 大é¨åå®è·µé½è¦æ±åæ°æ¯èè¡å½åãæ¬ä¹¦å»ºè®®ï¼èè¡å½åï¼ä»¥å¯ä»¥åJava飿 ·é©¼å³°å½å</li></ul><p>é常ï¼åºäºGET请æ±çRESTï¼æå³ç éè¿URLå享æ¤RESTæ¥å£ï¼å ¶ç»ææäºè¢«å®¢æ·ç«¯æè 代çç¼åï¼æ¯æéå®åçåè½ï¼å¦æGETæ¯æBODYï¼é£å¿ 须确认HTTP 代çæè æ¯WEB æ¡æ¶æ¯å¦æ¯æã</p><h2 id="restæå¡æç度模å" tabindex="-1"><a class="header-anchor" href="#restæå¡æç度模å"><span>RESTæå¡æç度模å</span></a></h2><p>个人è§å¾æ¯è¾æ¯æ·¡ï¼ä¹ä¸å»ºè®®ä¼ä¸æç §RESTæç度模åæå»ºæå¡</p><h2 id="å¼ç¨" tabindex="-1"><a class="header-anchor" href="#å¼ç¨"><span>å¼ç¨</span></a></h2><p>å¦ä½å®ä¹RESTæ¥å£ï¼è¿å¯ä»¥åèä¸å çä¸äºå®è·µï¼æ¯å¦Github REST APIï¼ElasticSerch REST API</p><ul><li><p>åå§æç« : https://ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm</p></li><li><p>Github REST å®è·µ: https://docs.github.com/en/rest</p></li><li><p>GitHubä¾å: <a href="https://github.com/github/docs/blob/main/content/rest/using-the-rest-api/getting-started-with-the-rest-api.md" target="_blank" rel="noopener noreferrer">Github API </a></p></li><li><p>Elastic Search ä¾å https://www.elastic.co/guide/en/elasticsearch/reference/current/rest-apis.html</p></li><li><p>æ¨è:<a href="http://ruanyifeng.com/blog/2018/10/restful-api-best-practices.html" target="_blank" rel="noopener noreferrer">é®ä¸å³°ï¼RESTful API æä½³å®è·µ</a></p></li><li><p>æ¨è:<strong><a href="https://opensource.zalando.com/restful-api-guidelines/index.html#_zalando_restful_api_and_event_guidelines" target="_blank" rel="noopener noreferrer">Zalando RESTful API and Event Guidelines</a></strong></p></li><li><p>
35æ¨è 微软 <a href="https://learn.microsoft.com/en-us/azure/architecture/best-practices/api-design" target="_blank" rel="noopener noreferrer">RESTful web API design </a></p></li><li><p>å客 <a href="https://blog.stoplight.io/api-design-patterns-for-rest-web-services" target="_blank" rel="noopener noreferrer">API Design Patterns for REST</a></p></li><li><p>https://blog.stoplight.io/api-design-patterns-for-rest-web-services)</p></li></ul>`,35)]))}const o=a(l,[["render",d],["__file","index.html.vue"]]),c=JSON.parse('{"path":"/article/rest-api-design/","title":"åå¸å¼API设计 ä¸ï¼REST","lang":"en-US","frontmatter":{"title":"åå¸å¼API设计 ä¸ï¼REST","tags":["æ¶æ","æ°ä¹¦"],"createTime":"2025/02/18 23:06:15","permalink":"/article/rest-api-design/","description":"å¦ææ²¡æ¶é´çï¼è®°ä½3ç¹ RESTä»¥èµæºä¸ºä¸å¿è®¾è®¡çAPIï¼æ°æ®æ¶æåæ°æ®æ¨¡å设计对RESTæ¥å£è´¨éæå¾å¤§å½±å éäºä¸å³å°±ç¨POST åèä¸ççREST APIï¼å¦githubï¼elasticsearch REST èæ¯ 2000å¹´ï¼äºèç½å
´èµ·æ°å¹´ï¼ä¼ä¸ç³»ç»å¹¿æ³æµè¡éè¿HTTP å®ç°è¿ç¨è°ç¨ï¼ä»£æ¿EJBï¼å½æ¶åºäºHTTPè¿ç¨è°ç¨ï¼æ 论URLç设计ï¼åæ°å½...","head":[["meta",{"property":"og:url","content":"http://ibeetl.com/article/rest-api-design/"}],["meta",{"property":"og:site_name","content":"é²å¤§èµ"}],["meta",{"property":"og:title","content":"åå¸å¼API设计 ä¸ï¼REST"}],["meta",{"property":"og:description","content":"å¦ææ²¡æ¶é´çï¼è®°ä½3ç¹ RESTä»¥èµæºä¸ºä¸å¿è®¾è®¡çAPIï¼æ°æ®æ¶æåæ°æ®æ¨¡å设计对RESTæ¥å£è´¨éæå¾å¤§å½±å éäºä¸å³å°±ç¨POST åèä¸ççREST APIï¼å¦githubï¼elasticsearch REST èæ¯ 2000å¹´ï¼äºèç½å
´èµ·æ°å¹´ï¼ä¼ä¸ç³»ç»å¹¿æ³æµè¡éè¿HTTP å®ç°è¿ç¨è°ç¨ï¼ä»£æ¿EJBï¼å½æ¶åºäºHTTPè¿ç¨è°ç¨ï¼æ 论URLç设计ï¼åæ°å½..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"en-US"}],["meta",{"property":"og:updated_time","content":"2026-05-20T04:25:34.000Z"}],["meta",{"property":"article:tag","content":"æ¶æ"}],["meta",{"property":"article:tag","content":"æ°ä¹¦"}],["meta",{"property":"article:modified_time","content":"2026-05-20T04:25:34.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"åå¸å¼API设计 ä¸ï¼REST\\",\\"image\\":[\\"\\"],\\"dateModified\\":\\"2026-05-20T04:25:34.000Z\\",\\"author\\":[]}"]]},"headers":[],"readingTime":{"minutes":10.2,"words":3059},"git":{"updatedTime":1779251134000,"contributors":[{"name":"lijiazhi","username":"lijiazhi","email":"[email protected]","commits":3,"avatar":"https://gravatar.com/avatar/1b5114831459724ad4acc394423b4b48ecfa4a7e0659fbe07a0ce5181a1050a7?d=retro"}]},"autoDesc":true,"filePathRelative":"article/æ¶æ/distribute-api-rest-design.md","categoryList":[{"id":"92a2b5","sort":10001,"name":"article"},{"id":"9a9aed","sort":10005,"name":"æ¶æ"}]}');export{o as comp,c as data};
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.