Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
Ïê½âREST¼Ü¹¹·ç¸ñ
 
  3664  次浏览      27
 2018-5-14 
 
±à¼­ÍƼö:

±¾ÎÄÀ´×ÔÓÚsegmentfault.com£¬Ò»ÆðÁ˽âRESTµÄÄÚÔÚ£¬ÈÏʶRESTµÄÓÅÊÆ£¬¶ø²»ÔÙ½«Ëüµ±×÷ÊÇ¡°ÀíËùµ±È»¡±

ÒýÑÔ

×÷ΪWeb¿ª·¢Õߣ¬Äã¿ÉÄÜ»ò¶à»òÉÙÁ˽âһЩRESTµÄ֪ʶ£¬ÉõÖÁÒѾ­·Ç³£Ï°¹ßÓÚËü£¬ÒÔÖÁÓÚÔÚÕýʽµØÑ§Ï°RESTµÄʱºò£¬Äã¿ÉÄÜÐÄÀï»áÏ룺¡°±¾À´¾ÍÊÇÕâÑù×öµÄ°¡£¬²»È»»¹ÄÜÔõô×öÄØ£¿¡±

ȷʵÊÇÕâÑù£¬RESTÒѾ­³ÉΪWebÊÀ½çµÄÒ»ÖÖÄÚÔڼܹ¹Ô­Ôò¡£ÕâÖ÷ÒªÊÇÒòΪRESTµÄ²úÉúȷʵÓëHTTPÓÐ×ÅÃܲ»¿É·ÖµÄÁªÏµ¡£RESTµÄÌá³öÕßRoy FieldingÔÚWeb½çÊÇһλ¾Ù×ãÇáÖØµÄÈËÎËûÊÇHTTPЭÒ飨1.0°æºÍ1.1°æ£©µÄÖ÷ÒªÉè¼ÆÕß¡¢Apache·þÎñÆ÷Èí¼þµÄ×÷ÕßÖ®Ò»¡¢Apache»ù½ð»áµÄµÚÒ»ÈÎÖ÷ϯ¡­¡­FieldingÔÚ¼¸ÄêÒ7 ȯ¹ËÆðRESTµÄÉè¼Æ¹ý³Ìʱ£¬Ëû˵µÀ£º

Throughout the HTTP standardization process, I was called on to defend the design choices of the Web. That is an extremely difficult thing to do within a process that accepts proposals from anyone on a topic that was rapidly becoming the center of an entire industry. I had comments from well over 500 developers, many of whom were distinguished engineers with decades of experience, and I had to explain everything from the most abstract notions of Web interaction to the finest details of HTTP syntax. That process honed my model down to a core set of principles, properties, and constraints that are now called REST.

ÔÚHTTP±ê×¼»¯µÄ¹ý³ÌÖУ¬Fielding×÷Ϊ×÷ÕßÖ®Ò»£¬¸ºÔðÏòÍâ½ç¶ÔHTTPµÄÉè¼Æ×÷³ö½âÊͺͱ绤¡£ÔÚÕâ¸ö¹ý³ÌÖУ¬ËûµÄ˼άģÐÍÊܵ½²»¶ÏµØ´¸Á¶£¬Ò»Ì××¼Ôò´ÓÖгÁµíÁËÏÂÀ´£¬Õâ¾ÍÊÇREST¡£

REST

RESTÊÇRepresentational State Transfer(ÔÚ±íʾ²ãÉϵÄ״̬´«Êä)µÄËõд£¬Õâ¸ö´ÊµÄ×ÖÃæÒâ˼ҪÔÚÎÄÕµĺóÃæ²ÅÄܽâÊÍÇå³þ¡£RESTÊÇÒ»ÖÖWEBÓ¦Óõļܹ¹·ç¸ñ£¬Ëü±»¶¨ÒåΪ6¸öÏÞÖÆ£¬Âú×ãÕâ6¸öÏÞÖÆ£¬Äܹ»»ñµÃÖî¶àÓÅÊÆ£¨ÏêϸÓŵãÔÚÎÄÕÂ×îºó×ܽᣩ¡£

ÏÈÓÃÒ»¾ä»°À´¸ÅÀ¨RESTful API(¾ßÓÐREST·ç¸ñµÄAPI): ÓÃURL¶¨Î»×ÊÔ´£¬ÓÃHTTP¶¯´Ê£¨GET,HEAD,POST,PUT,PATCH,DELETE£©ÃèÊö²Ù×÷£¬ÓÃÏìӦ״̬Âë±íʾ²Ù×÷½á¹û¡£

µ«ÊÇRESTÔ¶Ô¶²»½öÊÇÖ¸APIµÄ·ç¸ñ£¬ËüÊÇÒ»ÖÖÍøÂçÓ¦Óõļܹ¹·ç¸ñ¡£ÎÒÃǵ½ºóÃæ»áÓÐËùÌå»á¡£

ÁíÍ⣬ÐèҪעÒâµÄÊÇ£¬RESTµÄÔ­Ôò²»½ö½öÊÊÓÃÓÚHTTPЭÒé¡£µ«ÊÇ£¬ÓÉÓÚRESTµÄÓ¦Óó¡¾°¾ø´ó²¿·ÖÊÇWEBÓ¦Ó㬱¾ÆªÎÄÕ½«»ùÓÚHTTPÀ´ÌÖÂÛREST¡£

ÒýÈ룺´ÓÁíÒ»¸ö½Ç¶È¿´´ýǰºó¶Ë·ÖÀë

ÎÒÃÇä¯ÀÀÒ»¸öÍøÕ¾£¬Ëµµ½µ×¾ÍÊÇÓëÕâ¸öÍøÕ¾ÖеÄ×ÊÔ´½øÐл¥¶¯£¨»ñÈ¡¡¢Ìá½»¡¢¸üС¢É¾³ý£©¡£Ç°¶ËµÄ¹¤×÷£¬¾ÍÊÇΪÓû§´Ó·þÎñ¶Ë»ñÈ¡×ÊÔ´¡¢Õ¹Ê¾×ÊÔ´¡¢ÇëÇó·þÎñ¶Ë¸Ä±ä×ÊÔ´¡£

RESTful APIÓÐÖúÓÚ¿Í»§¶ËºÍ·þÎñ¶ËµÄ¹¦ÄÜ·ÖÀ룬·þÎñÆ÷ÍêÈ«°çÑÝ×ÅÒ»¸ö¡°×ÊÔ´·þÎñÉÌ¡±µÄ½ÇÉ«¡£¸÷ÖÖ²»Í¬µÄ¿Í»§¶Ë¶¼¿ÉÒÔͨ¹ýÒ»ÖµÄAPIÓëÕâ¸ö¡°×ÊÔ´·þÎñÉÌ¡±½»Á÷£¬´Ó¶øÓë×ÊÔ´½øÐл¥¶¯¡£

×ÊÔ´

ÔÚREST¼Ü¹¹ÖУ¬¡°×ÊÔ´¡±°çÑÝÕßÖ÷Òª½ÇÉ«¡£Ëü¾ßÓÐÒÔÏÂÌØµã£º

×ÊÔ´ÊÇÈκοÉÒÔ²Ù×÷£¨»ñÈ¡¡¢Ìá½»¡¢¸üС¢É¾³ý£©µÄÊý¾Ý£¬±ÈÈçÒ»¸öÎĵµ£¨document£©¡¢Ò»ÕÅͼƬ¡­¡­

wikipedia: "Web resources" were first defined on the World Wide Web as documents or files identified by their URLs. However, today they have a much more generic and abstract definition that encompasses every thing or entity that can be identified, named, addressed, or handled, in any way whatsoever, on the web. ¡°×ÊÔ´¡±°üÀ¨WebÖÐÈκοÉÒÔ±»±êʶ¡¢ÃüÃû¡¢¶¨Î»¡¢´¦ÀíµÄÊÂÎï¡£

×ÊÔ´µÄ¼¯ºÏÒ²ÊÇÒ»ÖÖ×ÊÔ´£¬±ÈÈçblogs±íʾ²©¿Í£¨×ÊÔ´£©µÄ¼¯ºÏ¡£

½øÐÐ×ÊÔ´²Ù×÷µÄʱºò£¬ÓÃURIÀ´Ö¸¶¨±»²Ù×÷µÄ×ÊÔ´¡£Èç¹ûÒ»¸öURI²»½öÄܱêʶһ¸öÍøÂçÉϵÄ×ÊÔ´£¬»¹Äܹ»¶¨Î»Õâ¸ö×ÊÔ´£¬ÄÇôÕâ¸öURIÒ²½ÐURL¡£

×ÊÔ´ÊÇÒ»¸ö³éÏóµÄ¸ÅÄ×ÊÔ´ÎÞ·¨±»´«Ê䣬ֻÄÜ´«Êä×ÊÔ´µÄ±íʾ£¨representation£©¡£Ò»¸ö×ÊÔ´¿ÉÒÔÓжàÖÖ±íʾ£¬±ÈÈ磬һ¸ö×ÊÔ´¿ÉÒÔÓÃHTML¡¢XML¡¢JSONÀ´±íʾ¡£¾ßÌå´«ÊäÄÄÖÖ±íʾȡ¾öÓÚ·þÎñ¶ËµÄÄÜÁ¦ºÍ¿Í»§¶ËµÄÒªÇó¡£´«ÊäµÄ±íʾδ±Ø¾ÍÊÇ·þÎñÆ÷´æ´¢Ê±Ê¹Óõıíʾ£¬±ÈÈ磬Õâ¸ö×ÊÔ´ÔÚ·þÎñÆ÷²»ÊÇÒÔHTML»òXML»òJSONÀ´´æ´¢µÄ£¬¿ÉÄÜÊÇÒ»ÖÖ¸ü¼ÓÀûÓÚѹËõµÄ±íʾ¡£×ܵÄÀ´Ëµ£¬¡°±íʾ¡±ÊÇ¡°×ÊÔ´¡±µÄ´æ´¢ºÍ´«ÊäÐÎʽ£¬¡°×ÊÔ´¡±ÊÇ¡°±íʾ¡±µÄÄÚÈÝ£¨³éÏó¸ÅÄ¡£²»¹ÜÓÃʲôÐÎʽÀ´±íʾ£¬Ê¼ÖÕÃèÊöµÄÊÇÕâ¸ö×ÊÔ´¡£

¾ÙÒ»¸öÀý×Ó£¬µ±ÎÒÃÇÌÖÂÛ¡°ÎÄÕÂÁÐ±í¡±Õâ¸ö×ÊԴʱ£¬ÎÒÃDz¢²»ÔÚºõËüÊÇjson¸ñʽ»¹ÊÇxml¸ñʽ£¬ÎÒÃÇÖ¸µÄÊÇËüµÄº¬Ò壺ij¸öÓû§µÄËùÓÐÎÄÕ¡£µ«Êǵ±ÎÒÃÇÕæµÄÒªÔÚ·þÎñÆ÷Óë¿Í»§¶ËÖ®¼ä´«ÊäÊý¾ÝµÄʱºò£¬²»ÄÜÖ±½Ó¡°´«Êä×ÊÔ´¡±£¬ÒòΪ×ÊÔ´Ì«³éÏóÁË£¬·¢ËÍ·½±ØÐëÒªÒÔijһÖÖ±íʾ£¨representation£©À´´«µÝËü£¨±ÈÈçjson£©£¬½ÓÊÕ·½²ÅÄܺܺõؽâÎöºÍ´¦Àí¡£

±íʾ£¨representation£©°üÀ¨Êý¾Ý£¨data£¬±íʾ×ÊÔ´±¾Éí£©ºÍÔªÊý¾Ý£¨metadata£¬ÓÃÓÚÃèÊöÕâ¸örepresentation£©¡£ÔÚRoy FieldingµÄÂÛÎÄÖÐÓÐÕâ¸ö¶¨Ò壺A representation is a sequence of bytes, plus representation metadata to describe those bytes.

ÔÚÇ°ÃæµÄÀý×ÓÖУ¬ÑϸñÀ´Ëµ£¬¡°json×Ö·û´®¡±²¢²»ÊÇÍêÕûµÄrepresentation£¬Õû¸öHTTPÏìÓ¦²ÅÊÇrepresentation¡£HTTP bodyÖеÄÊÇÊý¾Ý£¬HTTP headerÖеÄÊÇÔªÊý¾Ý£¨ÓÈÆäÊÇContent-TypeÕâÖÖ×ֶΣ©¡£

²Î¿¼https://restfulapi.net/

ÓÃURL¶¨Î»×ÊÔ´

ÔÚRESTful¼Ü¹¹·ç¸ñÖУ¬URLÓÃÀ´Ö¸¶¨Ò»¸ö×ÊÔ´¡£×ÊÔ´¾ÍÊÇ·þÎñÆ÷ÉϿɲÙ×÷µÄʵÌ壨¿ÉÒÔÀí½âΪÊý¾Ý£©¡£±ÈÈç˵URL/api/users±íʾµÄÊǸÃÍøÕ¾µÄËùÓÐÓû§£¬ÕâÊÇÒ»ÖÖ×ÊÔ´£¬¿ÉÒÔÓëÖ®»¥¶¯£¨»ñÈ¡¡¢Ìá½»¡¢¸üС¢É¾³ý£©¡£ÁíÍ⣬×ÊÔ´µØÖ·¾ßÓвã´Î½á¹¹£¬±ÈÈç/api/users/csr±íʾÓû§ÃûΪ'csr'µÄÓû§£¬/api/users/csr/blogs±íʾ'csr'µÄËùÓв©¿Í£¬/api/users/csr/blogs/1234567±íʾÆäÖеÄijһƪ²©¿Í¡£ÕâЩ¶¼ÊÇ×ÊÔ´£¬ºóÕßǶÌ×ÔÚǰÕßÖ®ÖС£

¼ÈÈ»URL±íʾһ¸ö×ÊÔ´£¬×ÔÈ»¾Í²»Ó¦¸Ã°üº¬¶¯´Ê£¬ËüÓ¦¸ÃÓÉÃû´Ê×é³É¡£Ò»¸ö not RESTful µÄÀý×ÓÊÇͨ¹ýÏòapi/delete/resource·¢ËÍGETÇëÇóÀ´É¾³ýÒ»¸ö×ÊÔ´¡£

¸üÏêϸµÄURLÉè¼Æ¿ÉÒԲ鿴ÈîÒ»·åµÄ"RESTful API Éè¼ÆÖ¸ÄÏ"»òÕßÖªºõ¸ßƱ»Ø´ð¡£URL·ç¸ñÖ»ÊÇRESTµÄÍâ±í£¬²»ÊDZ¾ÎĵÄÖØµã¡£

²Ù×÷×ÊÔ´

¼ÈȻͨ¹ýURLÄܹ»Ö¸¶¨Ò»¸ö·þÎñÆ÷ÉϵÄ×ÊÔ´¡£ÄÇôÎÒÃÇÓ¦¸ÃÈçºÎÓëÕâ¸ö×ÊÔ´½øÐл¥¶¯ÄØ£¿ÎÒÃǶÔÕâ¸ö×ÊÔ´(URL)ʹÓò»Í¬µÄHTTP·½·¨£¬¾Í´ú±í¶ÔÕâ¸ö×ÊÔ´µÄ²»Í¬²Ù×÷£º

GET£¨SELECT£©£º´Ó·þÎñÆ÷»ñÈ¡×ÊÔ´£¨Ò»¸ö×ÊÔ´»ò×ÊÔ´¼¯ºÏ£©¡£

POST£¨CREATE£©£ºÔÚ·þÎñÆ÷н¨Ò»¸ö×ÊÔ´£¨Ò²¿ÉÒÔÓÃÓÚ¸üÐÂ×ÊÔ´£©¡£

PUT£¨UPDATE£©£ºÔÚ·þÎñÆ÷¸üÐÂ×ÊÔ´£¨¿Í»§¶ËÌṩ¸Ä±äºóµÄÍêÕû×ÊÔ´£©¡£

PATCH£¨UPDATE£©£ºÔÚ·þÎñÆ÷¸üÐÂ×ÊÔ´£¨¿Í»§¶ËÌṩ¸Ä±äµÄ²¿·Ö£©¡£

DELETE£¨DELETE£©£º´Ó·þÎñÆ÷ɾ³ý×ÊÔ´¡£

HEAD£º»ñÈ¡×ÊÔ´µÄÔªÊý¾Ý¡£

OPTIONS£º»ñÈ¡ÐÅÏ¢£¬¹ØÓÚ×ÊÔ´µÄÄÄЩÊôÐÔÊǿͻ§¶Ë¿ÉÒԸıäµÄ¡£

GET¡¢HEAD¡¢PUT¡¢DELETE·½·¨ÊÇÃݵȷ½·¨(¶ÔÓÚͬһ¸öÄÚÈݵÄÇëÇ󣬷¢³ön´ÎµÄЧ¹ûÓë·¢³ö1´ÎµÄЧ¹ûÏàͬ)¡£

GET¡¢HEAD·½·¨Êǰ²È«·½·¨(²»»áÔì³É·þÎñÆ÷ÉÏ×ÊÔ´µÄ¸Ä±ä)¡£

PATCH²»Ò»¶¨ÊÇÃݵȵġ£PATCHµÄʵÏÖ·½Ê½ÓпÉÄÜÊÇ"Ìṩһ¸öÓÃÀ´Ìæ»»µÄÊý¾Ý"£¬Ò²ÓпÉÄÜÊÇ"Ìṩһ¸ö¸üÐÂÊý¾ÝµÄ·½·¨"(±ÈÈçdata++)¡£Èç¹ûÊǺóÕߣ¬ÄÇôPATCH²»ÊÇÃݵȵġ£

²Î¿¼£ºHTTP Methods for RESTful Services

ͨ¹ýHTTP״̬Âë±íʾ²Ù×÷µÄ½á¹û

ËäÈ»HTTP״̬ÂëÉè¼ÆµÄ±¾Òâ¾ÍÊDZíʾ²Ù×÷½á¹û£¬µ«ÊÇÓÐʱºòÈËÃÇÍùÍùûÓкܺõÄÀûÓÃËü£¬RESTful APIÒªÇó³ä·ÖÀûÓÃHTTP״̬Âë

200 OK - [GET]£º·þÎñÆ÷³É¹¦·µ»ØÓû§ÇëÇóµÄÊý¾Ý£¬¸Ã²Ù×÷ÊÇÃݵȵģ¨Idempotent£©¡£
201 CREATED - [POST/PUT/PATCH]£ºÓû§Ð½¨»òÐÞ¸ÄÊý¾Ý³É¹¦¡£
202 Accepted - [*]£º±íʾһ¸öÇëÇóÒѾ­½øÈëºǫ́ÅŶӣ¨Òì²½ÈÎÎñ£©
204 NO CONTENT - [DELETE]£ºÓû§É¾³ýÊý¾Ý³É¹¦¡£
400 INVALID REQUEST - [POST/PUT/PATCH]£ºÓû§·¢³öµÄÇëÇóÓдíÎ󣬷þÎñÆ÷ûÓнøÐÐн¨»òÐÞ¸ÄÊý¾ÝµÄ²Ù×÷£¬¸Ã²Ù×÷ÊÇÃݵȵġ£
401 Unauthorized - [*]£º±íʾÓû§Ã»ÓÐȨÏÞ£¨ÁîÅÆ¡¢Óû§Ãû¡¢ÃÜÂë´íÎ󣩡£
403 Forbidden - [*] ±íʾÓû§µÃµ½ÊÚȨ£¨Óë401´íÎóÏà¶Ô£©£¬µ«ÊÇ·ÃÎÊÊDZ»½ûÖ¹µÄ¡£
404 NOT FOUND - [*]£ºÓû§·¢³öµÄÇëÇóÕë¶ÔµÄÊDz»´æÔڵļǼ£¬·þÎñÆ÷ûÓнøÐвÙ×÷£¬¸Ã²Ù×÷ÊÇÃݵȵġ£
406 Not Acceptable - [GET]£ºÓû§ÇëÇóµÄ¸ñʽ²»¿ÉµÃ£¨±ÈÈçÓû§ÇëÇóJSON¸ñʽ£¬µ«ÊÇÖ»ÓÐXML¸ñʽ£©¡£
410 Gone -[GET]£ºÓû§ÇëÇóµÄ×ÊÔ´±»ÓÀ¾Ãɾ³ý£¬ÇÒ²»»áÔٵõ½µÄ¡£
422 Unprocesable entity - [POST/PUT/PATCH] µ±´´½¨Ò»¸ö¶ÔÏóʱ£¬·¢ÉúÒ»¸öÑéÖ¤´íÎó¡£
500 INTERNAL SERVER ERROR - [*]£º·þÎñÆ÷·¢Éú´íÎó£¬Óû§½«ÎÞ·¨ÅжϷ¢³öµÄÇëÇóÊÇ·ñ³É¹¦¡£

ÍêÕû״̬ÂëÁбí

ÈçºÎÉè¼ÆRESTful API

ÔÚ¹ýÈ¥²»Ê¹ÓÃRESTful¼Ü¹¹·ç¸ñµÄʱºò£¬Èç¹ûÎÒÃÇÒªÉè¼ÆÒ»¸öϵͳ£¬»áÒÔ¡°²Ù×÷¡±Îª³ö·¢µã£¬È»ºóÎ§ÈÆËüÈ¥½¨ÉèÆäËûÐèÒªµÄ¶«Î÷¡£

¾Ù¸öÀý×Ó£¬ÎÒÃÇÒªÏòϵͳÖÐÔö¼ÓÒ»¸öÓû§µÇ½µÄ¹¦ÄÜ£º

ÐèÒªÒ»¸öÓû§µÇ½µÄ¹¦ÄÜ(²Ù×÷)

Ô¼¶¨Ò»¸öÓÃÓڵǼµÄAPI(Ò²¾ÍÊÇURL)

Ô¼¶¨Õâ¸öAPIµÄʹÓ÷½Ê½(·¢ËÍÏìӦʲôÊý¾Ý¡¢¸ñʽÊÇʲô)

ǰºó¶ËÕë¶ÔÕâ¸öAPI½øÐпª·¢

ÕâÖÖÉè¼Æ·½Ê½ÓÐÈçÏÂȱµã£º

µ±ÎÒÃDz»¶ÏΪÕâ¸öϵͳÔö¼Ó²Ù×÷£¬Ã¿Ôö¼ÓÒ»¸ö²Ù×÷¶¼Òª°´ÕÕÉÏÃæµÄÁ÷³ÌÉè¼ÆÒ»´Î£¬µÚ2ºÍ3µãµÄ¹¤×÷ʵ¼ÊÊÇ¿ÉÒÔ´ó´óÏ÷¼õµÄ(ͨ¹ýREST)¡£

²Ù×÷Ö®¼ä¿ÉÄÜÊÇÓÐÒÀÀµµÄ£¬ÒÀÀµ¶àÆðÀ´£¬ÏµÍ³»á±äµÃºÜ¸´ÔÓ¡£

ÎÒÃǵÄAPIȱ·¦Ò»ÖÂÐÔ(ÐèÒªÒ»·ÝÅÓ´óµÄÎĵµÀ´¼Ç¼apiµÄµØÖ·¡¢Ê¹Ó÷½Ê½)¡£

²Ù×÷ͨ³£±»ÈÏΪÊÇÓи±×÷Óã¨Side Effect£©µÄ£¬ºÜÄÑʹÓûº´æ¼¼Êõ¡£

¶øÈç¹ûÎÒÃÇÉè¼ÆREST·ç¸ñµÄϵͳ£¬×ÊÔ´ÊǵÚһλµÄ¿¼ÂÇ£¬Ê×ÏÈ´Ó×ÊÔ´µÄ½Ç¶È½øÐÐϵͳµÄ²ð·Ö¡¢Éè¼Æ£¬¶ø²»ÊÇÏñÒÔÍùÒ»ÑùÒÔ²Ù×÷Ϊ½Ç¶ÈÀ´½øÐÐÉè¼Æ¡£

ÓÃÁ½¸öÀý×ÓÀ´ËµÃ÷£ºÒøÐеÄתÕËAPI£¬¼´Ê±Í¨Ñ¶Èí¼þÖз¢ËÍÏûÏ¢µÄAPI¡£

ÕâÁ½¸ö¹¦Äܷdz£¾ßÓС°¶¯×÷ÐÔ¡±£¬¿´ÆðÀ´ºÍ¡°×ÊÔ´¡±ÁªÏµ²»´ó£¬ºÜÈÝÒ׾ͻáÉè¼Æ³Énot RESTfulµÄAPI£ºPOST /transfer/${amount}/to/${toUserID}¡¢POST /api/sendMessage¡£

Ò»µ©ÔÚURLÖÐÒýÈëÁ˶¯´Ê£¬Õâ¸öURLµÄ¹¦ÄܾͶ¨ËÀÁË£¬ÎÞ·¨ÓÃÓÚ±ðµÄÓÃ;£¨±ÈÈ磬GET /transfer/${amount}/to/${toUserID}»òGET /api/sendMessageµÄÓïÒåºÜÆæ¹Ö£¬²»ºÃʹÓã©¡£²¢ÇÒ£¬²»Í¬¹¦ÄܵÄAPIÓи÷×ԵĽṹ£¬Ò»ÖÂÐԺܲÐèÒªÒ»·ÝÏêϸµÄAPIÎĵµ²ÅÄÜʹÓá£

ÕâÖÖÇé¿öÏ£¬ÒªÈçºÎͨ¹ýRESTful¼Ü¹¹·ç¸ñ£¬Éè¼ÆÒ»Ì×Ò»Ö¡¢¶àÓÃ;µÄURLÄØ£¿

¼òµ¥µØËµ£¬¾ÍÊǽ«Ò»¸ö¡°¶¯×÷¡±Àí½âΪ¡°²Ù×÷Ò»¸ö×ÊÔ´¡±¡£ÕâÀïµÄ¡°²Ù×÷¡±ÊÇÖ¸HTTPµÄ·½·¨¡£

¶ÔÓÚתÕ˶¯×÷£¬¾Í¿ÉÒÔÀí½âΪ¡°Ð½¨Ò»¸öתÕËÊÂÎñ¡±£¨×ªÕËÊÂÎñÊÇ×ÊÔ´£©£¬Òò´ËAPI¾Í¿ÉÒÔÉèÖóÉÕâÑù: POST /transactions£¬ÇëÇóÌåΪ£ºto=632&amount=500¡£ÕâÑùµÄÉè¼Æ²»µ«¼ò½àÃ÷ÁË£¬¶øÇÒÎÒÃÇ¿ÉÒÔ½«Õâ¸öURLÓÃÓÚ±ðµÄÓÃ;£ºÍ¨¹ýGET /transactionsÀ´»ñÈ¡¸ÃÓû§µÄËùÓÐתÕËÊÂÎñ¡£»¹¿ÉÒÔ½«GET /transactions/456828¶¨ÒåΪ¡°»ñȡijһ´ÎתÕ˼Ǽ¡±¡£

¼´Ê±Í¨Ñ¶Èí¼þÖз¢ËÍÏûÏ¢µÄ¶¯×÷£¬ÎÒÃÇ¿ÉÒÔÀí½âΪ¡°²Ù×÷ÁÄÌì¼Ç¼£¨ÁÄÌì¼Ç¼ÊÇ×ÊÔ´£¬ËüÊÇÓÉ¡°ÏûÏ¢¡±×é³ÉµÄ¼¯ºÏ£¬ÏûÏ¢Ò²ÊÇ×ÊÔ´£©¡±£¬ËùÒÔAPIÉè¼ÆÎª

POST /messages # ´´½¨ÐµÄÁÄÌì¼Ç¼£¨body´«ÊäÏûÏ¢µÄÄÚÈÝ£©
GET /messages # »ñÈ¡ÁÄÌì¼Ç¼£¨·µ»ØÒ»¸öÊý×飬ÆäÖÐÿ¸öÏîÊÇÒ»¸öÏûÏ¢£©
GET /messages/${messageID} # »ñȡij¸öÏûÏ¢µÄÏêϸÐÅÏ¢
PUT /messages/${messageID} # ¸üÐÂij¸öÏûÏ¢£¨body´«ÊäÏûÏ¢µÄÄÚÈÝ£©
DELETE /messages/${messageID} # ɾ³ýij¸öÏûÏ¢µÄ¼Ç¼

ͬÀí£¬ÂÛ̳ÀàÓ¦Ó÷¢Ìû¡¢»ØÌûµÄAPIÒ²¿ÉÒÔÕâÑùÉè¼Æ¡£

´ÓÒÔÉϵÄÁ½¸öÀý×ÓÎÒÃÇ¿ÉÒÔ¿´³ö£¬Ê¹ÓÃRESTful·ç¸ñ¿ÉÒÔ¿Ë·þ´«Í³¼Ü¹¹·ç¸ñµÄÄÇ4¸öȱÏÝ£º

Éè¼ÆAPI¹¤×÷Á¿¼õÉÙ£¬ÒòΪ¹¦ÄÜÐèÇóÒ»µ©³öÀ´£¬ÐèÒª²Ù×÷µÄ×ÊÔ´¡¢²Ù×÷µÄ·½Ê½Á¢¿Ì¾ÍÄÜ·ÖÎö³öÀ´£¬Òò´Ë×ÊÔ´URLºÍAPIµÄʹÓ÷½Ê½(GET, POST...)¶¼ºÜÈÝÒ׵õ½¡£

ûÓÐÁ˲Ù×÷Ö®¼äµÄÒÀÀµ¡£×ÊÔ´Ö®¼äËäÈ»¿ÉÄÜÓйØÁª£¬µ«ÊÇСµÃ¶à¡£

¶Ô×ÊÔ´µÄ²Ù×÷Ò²¾ÍÄÇô¼¸ÖÖ(»ñÈ¡¡¢Ð½¨¡¢Ð޸ġ¢É¾³ý)£¬APIµÄÒ»ÖÂÐÔ¡¢×ÔÎÒÃèÊöÐÔºÜÇ¿£¬²»ÐèÒª¹ý¶à½âÊÍ¡£

¶ÔÓÚGETÇëÇó£¬ÎÒÃǶ¼¿ÉÒÔ¿¼ÂÇʹÓûº´æ£¬ÒòΪÔÚRESTfulµÄ¼Ü¹¹ÖУ¬GETÇëÇó´ú±í»ñÈ¡Êý¾Ý£¬±ØÐëÊǰ²È«¡¢Ãݵȵġ£

·þÎñÆ÷ÎÞ״̬

¸ù¾ÝRESTµÄ¼Ü¹¹ÏÞÖÆ£¬RESTfulµÄ·þÎñÆ÷±ØÐëÊÇÎÞ״̬µÄ£¬ÕâÒâζ×ÅÀ´×Ô¿Í»§µÄÿһ¸öÇëÇó±ØÐë°üº¬·þÎñÆ÷´¦Àí¸ÃÇëÇóËùÐèµÄËùÓÐÐÅÏ¢£¬ ·þÎñÆ÷²»ÄÜÀûÓÃÈκÎÒѾ­´æ´¢µÄ¡°ÉÏÏÂÎÄ(context£¬ÔÚÕâÀï±íʾÓû§µÄ»á»°×´Ì¬)¡±À´´¦Àíе½À´µÄÇëÇ󣬻Ự״ֻ̬ÄÜÓɿͻ§¶ËÀ´±£´æ£¬²¢ÇÒÔÚÇëÇóʱһ²¢Ìṩ¡£

ÕâÀï×¢ÒâÁ½µã¡£1. ·þÎñÆ÷²»ÄÜ´æ´¢¡°ÉÏÏÂÎÄ¡±²»´ú±íÁ¬Êý¾Ý¿â¶¼²»ÄÜÓУ¬¡°ÉÏÏÂÎÄ¡±Ö¸ÄÇЩÔÚ·þÎñÆ÷ÄÚ´æÖеġ¢·Ç³Ö¾Ã»¯µÄÊý¾Ý¡£2. ÎÞ״̬²»´ú±í²»ÄÜÓлỰ(sessions)£¬ÎÞ״̬½ö½öÖ¸·þÎñÆ÷ÎÞ״̬¡£·þÎñÆ÷²»¼Ç¼¡¢Î¬»¤»á»°£¬µ«ÊǻỰ״̬¿ÉÒÔÓɿͻ§¶ËÔÚÿ´ÎÇëÇóµÄʱºòÌṩ¡£

ÎÒÒ»¿ªÊ¼ÒÔΪÎÞ״̬ÓëÓû§µÇ½ÊdzåÍ»µÄ£¬ºóÀ´ÔÚDo sessions really violate RESTfulness? - StackOverflowÉÏÕÒµ½ÁËÒ»¸öÁîÎÒÂúÒâµÄ½â´ð¡£ÒÔÏÂÁ½·ùͼժ¼×ÔÕâ¸ö´ð°¸¡£

ÎÞ״̬µÄÈÏÖ¤»úÖÆ£º

What you need is storing username and password on the client and send it with every request. You don't need more to do this than HTTP basic auth and an encrypted connection.

Ö»ÐèÒª½«Óû§ÃûºÍÃÜÂë´æ´¢ÔÚ¿Í»§¶Ë£¬È»ºó¿Í»§¶Ëÿ´Î·¢ËÍÇëÇ󶼸½´øÉÏÓû§ÃûºÍÃÜÂë¡£Òª×öµ½ÕâµãÄãÖ»ÐèÒªHTTP»ù±¾ÈÏÖ¤£¨¼òµ¥À´Ëµ¾ÍÊǽ«Óû§ÃûºÍÃÜÂë·ÅÔÚHTTPÍ·²¿£©ºÍÒ»¸ö¼ÓÃܵÄÁ¬½Ó(HTTPS)¡£

Èç¹ûÿ´ÎÈÏÖ¤£¬¶¼ÒªÈ¥Êý¾Ý¿â²éѯÓû§µÄÐÅÏ¢À´ºË¶Ô£¬ÄÇôÏìÓ¦»á·Ç³£Âý£¬¶øÇÒ·þÎñÆ÷Ò²»áÓкܴóµÄÐÔÄÜËðʧ¡£ÎªÁ˼ӿìÈÏÖ¤µÄËÙ¶È£¬×îºÃÔÚÄÚ´æÖÐʹÓÃÈÏÖ¤»º´æ¡£Õâ²¢²»Î¥±³¡°ÎÞ״̬¡±µÄÏÞÖÆ£¬ÒòΪ»º´æµÄ×÷Óýö½öÆð¼ÓËÙµÄ×÷Óã¬Ã»Óлº´æÕÕÑùÄܹ¤×÷¡£

ÎÞ״̬µÄµÚÈý·½¼øÈ¨»úÖÆ£º

What about 3rd party clients? They cannot have the username and password and all the permissions of the users. So you have to store separately what permissions a 3rd party client can have by a specific user. So the client developers can register they 3rd party clients, and get an unique API key and the users can allow 3rd party clients to access some part of their permissions. Like reading the name and email address, or listing their friends, etc... After allowing a 3rd party client the server will generate an access token. These access token can be used by the 3rd party client to access the permissions granted by the user.

ͨ¹ýÕâ¸ö·½Ê½£¬Óû§¿ÉÒÔ¸øµÚÈý·½Ó¦ÓÃÊÚȨ£¬ÈõÚÈý·½Ó¦ÓÃÄÃ×ÅÓû§µÄ¡°ÁîÅÆ¡±·ÃÎÊÍøÕ¾µÄһЩ·þÎñ¡£

ÒÔÉÏÁ½·ùͼ½²µÄÊÇRESTful·ç¸ñµÄÉí·ÝÈÏÖ¤»úÖÆ¡£ÔÚʵ¼ùÖÐ×îºÃʹÓÃOAuth 2.0¿ò¼Ü¡£

ÎÞ״̬ÔöÇ¿ÁËϵͳµÄ¹ÊÕϻָ´ÄÜÁ¦£¬ÒòΪÔÚ·þÎñÆ÷ÉÏûÓб£´æsessionµÄ״̬£¬ËùÒÔ»Ö¸´ÆðÀ´¸üÈÝÒס£

¸üÖØÒªµÄÊÇ£¬ÎÞ״̬Òâζ×Å·Ö²¼Ê½ÏµÍ³Äܹ»¸üºÃµØ¹¤×÷£¬¸ºÔؾùºâÆ÷¿ÉÒÔ×ÔÓɵؽ«ÇëÇó·Ö·¢µ½ÈÎÒâµÄ·þÎñÆ÷¡£ÒòΪÇëÇóÖж¼ÒѾ­°üº¬ÁË·þÎñÆ÷ËùÐèµÄËùÓÐÐÅÏ¢£¬ÈκηþÎñÆ÷¶¼¿ÉÒÔ´¦Àí¡£

²»½ö½öÊÇ·þÎñÆ÷£¬´úÀí¡¢Íø¹Ø¡¢·À»ðǽҲ¿ÉÒÔÀí½âÏûÏ¢£¬´Ó¶ø¿ÉÒÔÔÚ²»Ð޸ĽӿڵÄÇé¿öÏ£¬Ôö¼Ó¸ü¶àÇ¿´óµÄ¹¦ÄÜ£¨±ÈÈç´úÀí»º´æ£©¡£

²¢ÇÒ£¬ÎÞ״̬ÈÃϵͳµÄºáÏòÍØÕ¹ÄÜÁ¦Ç¿´ó¡£ÒòΪ²»ÐèÒªÔÚ²»Í¬µÄ·þÎñÆ÷Ö®¼äͬ²½session״̬£¬ËùÒÔ·þÎñÆ÷Ö®¼äµÄ¹µÍ¨¿ªÏúºÜµÍ¡£Ôö¼Ó·þÎñÆ÷µÄÊýÁ¿²»»á´øÀ´Ã÷ÏÔµÄÐÔÄÜËðʧ£¨¡°1+1¡±¸ü½Ó½üÓÚ¡°2¡±ÁË£©¡£

ÐèҪעÒâµÄÊÇ£¬REST²»ÊÇÒ»¸ö¡°×ڽ̡±¡£ÔÚÄã×Ô¼ºµÄÓ¦ÓÃÖУ¬×ñÑ­RESTµÄͬʱӦ¸Ã±£³ÖºÏÊʵij߶ȡ£Í¨¹ýȨºâÀû±×£¬Ñ¡Ôñ×ÜÌåÐ§Òæ×î´óµÄ·½°¸£¬¼´Ê¹Õâ¸ö·½°¸ÓпÉÄÜ¡°ÉÔ΢Υ·´RESTµÄÔ­Ôò¡±¡£Ïê¼û"REST is not a religion..." - stackoverflow

HATEOAS

ͼƬÀ´×Ôsteps toward the glory of REST¡£

Ç°ÃæÒѾ­ÌÖÂÛÁËlevel 1ºÍlevel 2£¬Êµ¼ÊÉÏREST»¹ÓÐÒ»¸ö¸ü¸ßµÄ²ã´Î£ºHATEOAS(Hypermedia As The Engine Of Application State)¡£

¶ÔÓÚ¿Í»§¶ËµÄ×ÊÔ´ÇëÇ󣬷þÎñÆ÷²»½öÒª·µ»ØËùÇëÇóµÄ×ÊÔ´£¬¶øÇÒÒª·µ»Ø¿Í»§¶ËËù´¦µÄ״̬ºÍ¿É×ªÒÆµÄ״̬¡££¨¿Í»§¶ËÓÐ״̬£©

״̬¿ÉÒÔ¼òµ¥µØÀí½âΪ¿Í»§¶ËչʾµÄÊý¾Ý¡£¿ÉÒ԰ѿͻ§¶Ë±ÈÓ÷³ÉÒ»¸ö״̬»ú£¬ÄÇôÕâ¸ö״̬»úÌø×ªµ½Ò»¸öеÄ״̬£¬¾Í»áÏÔʾеÄÄÚÈÝ¡£¡°Ê×Ò³¡±¡°ÎÄÕÂÁÐ±í¡±¡°Ä³ÆªÎÄÕ¡±¾ÍÊÇÈýÖÖ¿Í»§¶Ë״̬¡£

¿Í»§¶Ë²»ÐèÒªÌáǰ֪µÀÓ¦ÓÃÓÐÄÄЩ״̬£¬¶øÊǸù¾Ý·þÎñ¶ËÏìÓ¦µÄ¡°¿É×ªÒÆµÄ״̬¡±£¬Ìṩ¸øÓû§Ñ¡Ôñ£¬´Ó¶ø·¢Éú×´Ì¬×ªÒÆ¡£

Óüòµ¥µÄ»°À´Ëµ£¬ÔÚÑϸñµÄRESTful¼Ü¹¹ÖУ¬¿Í»§¶Ë²»ÐèÒªÌáǰ֪µÀ·þÎñ¶ËµÄAPIÓÐÄÄЩ¡¢Ôõôµ÷Óã¬ÔÚ¿Í»§¶ËÓë·þÎñÆ÷ͨÐŵĹý³ÌÖУ¬·þÎñ¶Ë»á¸æË߿ͻ§¶Ë£ºÔÚÄ㵱ǰËù´¦µÄ״̬Ï£¬ÓÐÄÄЩAPI¿ÉÒÔʹÓᢿÉÒÔ×ªÒÆµ½ÄÄЩ״̬¡£

¼ÈÈ»·þÎñÆ÷ÊÇÎÞ״̬µÄ£¬ÄÇôËüÒªÈçºÎÖªµÀ·¢ÆðÇëÇóµÄÓû§´¦ÓÚÊ²Ã´×´Ì¬ÄØ£¿Õâ¾ÍÒªÇó¿Í»§¶ËÔÚ·¢ËÍÇëÇóµÄʱºòҪЯ´øÉÏ×ã¹»µÄÐÅÏ¢£¬È÷þÎñÆ÷Äܹ»ÅжϿͻ§¶ËËù´¦µÄ״̬¡£

Õâ¾ÍºÜÏñ10086µÄ¡°µç»°×Ô¶¯ÓïÒôÓ¦´ð·þÎñ¡±£ºÄãÏëÒª²éѯÄãµÄÊÖ»úÁ÷Á¿£¬Ö»ÐèÒª»á²¦´ò¡°10086¡±£¬¶Ô·½»áÌáʾÄã°´ÏÂÄÄЩ°´¼ü¾ÍÄܽøÈëÄÄЩ״̬¡£½øÈëÏÂÒ»¸ö״̬ÒÔºó£¬ÓÖ»áÓÐÓïÒôÌáʾÄã½ÓÏÂÀ´Äܹ»°´ÄÄЩ°´¼ü¡­¡­×îÖÕ£¬ÄãÄܽøÈëµ½ÄãÏëÒªµÄÄǸö״̬£¨Á÷Á¿²éѯ·þÎñ£©¡£ÄãÐèÒª¼ÇסµÄ½ö½öÊÇ¡°10086¡±Õâ¸öºÅÂë¶øÒÑ£¡

10086µÄÓïÒôÌáʾÏ൱ÓÚHypermedia£¬ÊÇÇý¶¯Ó¦ÓÃ״̬ת»»µÄ¡°ÒýÇæ¡±¡£

ÔÙ½øÒ»²½ÏëÏ룬ÔÚRESTful¼Ü¹¹ÖУ¬ËùÓеÄ״̬Æäʵ¾Í×é³ÉÁËÒ»¿ÅÊ÷(¸ü׼ȷµØËµÊÇÍø)£º¸ù½Úµã¾ÍÊÇÍøÕ¾µÄ»ùµØÖ·¡£ÔÚÄã»ñȡһ¸ö½ÚµãÖеÄ×ÊÔ´µÄͬʱ£¬·þÎñÆ÷»¹»á·µ»Ø¸øÄãÕâ¸ö½ÚµãµÄ±ß£ºHypermedia(³¬Á´½Ó¾ÍÊÇÒ»ÖÖHypermedia)¡£Í¨¹ýHypermedia£¬ÄãÄܹ»ÖªµÀÏàÁÚ½ÚµãµÄ»ù±¾ÐÅÏ¢¡¢µØÖ·¡£

½á¹û¾ÍÊÇ£ºÄãÄܹ»·ÃÎʵ½Õâ¿ÅÊ÷µÄËùÓнڵ㣬¶øÄãËùÐèÒªÌáǰ֪µÀµÄÖ»ÊÇ¡°ÈçºÎµ½´ï¸ù½Úµã¡±¶øÒÑ£¡

ÿ¸ö½Úµã¾ÍÊÇÒ»¸ö״̬¡£Óû§¿ÉÒÔÔÚÕâ¸ö×´Ì¬ÍøÖв»¶ÏÌø×ª¡£

Õâ¸öÀý×Ó£¨Öªºõ£©ºÍÕâ¸öÀý×Ó£¨stackoverflow£©Ò²ÊDz»´íµÄ½âÊÍ¡£

wikipediaµÄ½âÊÍ£ºa REST client should then be able to use server-provided links dynamically to discover all the available actions and resources it needs. As access proceeds, the server responds with text that includes hyperlinks to other actions that are currently available. There is no need for the client to be hard-coded with information regarding the structure or dynamics of the REST service.

ÕâÖּܹ¹µÄÓÅÊÆ·Ç³£Ã÷ÏÔ£ºÇ°ºó¶ËÖ®¼äµÄñîºÏ¸ü¼Ó΢Èõ¡£

Ëæ×ÅÓ¦Óù¦ÄܵÄÉý¼¶¸Ä±ä£¬¡°Ê÷¡±µÄÑù×Ó»á´ó´ó¸Ä±ä£¬µ«ÊÇÖ»ÐèÒªÈúó¶ËÐ޸ķµ»ØµÄ×ÊÔ´ÄÚÈݺÍHypermedia£¬Ç°¶Ë¼¸ºõ²»ÓøĶ¯¡£¹¦ÄܵÄÑÝ»¯¸ü¼ÓÁé»îÁË¡£

¡°×ÊÔ´¡±ºÍ¡°×´Ì¬¡±µÄ¹ØÏµ

ÏÖÔÚÄãÓ¦¸ÃÃ÷°×Representational State TransferÖеÄState Transfer(״̬´«Êä)ÊÇʲôÒâ˼ÁË£ºÔÚHATEOASÖУ¬·þÎñ¶Ë½«¿Í»§¶ËËù´¦µÄ״̬ºÍ¿ÉÒÔ´ïµ½µÄ״̬´«Ê䏸¿Í»§¶Ë¡£

µÈһϣ¬ÔÚÇ°ÃæµÄ×ÊԴС½Ú£¬ÎÒÃDz»ÊÇ˵¹ý´«ÊäµÄÊÇ×ÊÔ´±íʾ£¨representation£©Âð£¿ÔõôÕâÀïÓÖ˵´«ÊäµÄÊÇ״̬£¿

ÆäʵÔÚREST¼Ü¹¹·ç¸ñÖУ¬¡°´«Êä״̬¡±ºÍ¡°´«Êä×ÊÔ´±íʾ¡±ÊÇͬһ¸öÒâ˼¡£¿Í»§¶ËËù´¦µÄ״̬£¬ÊÇÓÉËü½ÓÊÕµ½µÄ×ÊÔ´±íʾÀ´¾ö¶¨µÄ¡£±ÈÈ磬¿Í»§¶Ë½ÓÊÕµ½/user/csr/blogs×ÊÔ´£¬ÄÇô¿Í»§¶ËµÄ״̬¾Í±ä³É/user/csr/blogs(ÏÔʾcsrµÄÎÄÕÂÁбí)¡£

µÈһϣ¬ÎªÊ²Ã´¿Í»§¶Ë»áÊÕµ½¡°/user/csr/blogs¡±×ÊÔ´£¿ÒòΪ¿Í»§¶ËÇëÇóµÄ¾ÍÊÇ¡°/user/csr/blogs¡±×ÊÔ´¡£

¼ÌÐø×·ËÝ£¬ÎªÊ²Ã´¿Í»§¶Ë»áÇëÇóÕâ¸ö×ÊÔ´£¿ÒòΪÓû§µã»÷ÁË¡°²é¿´ÎÄÕÂÁÐ±í¡±µÄÁ´½Ó£¨Õâ¸öÁ´½ÓÆäʵ¾ÍÊÇÒ»¸öHypermedia£©¡£

¼ÌÐø×·ËÝ£¬ÎªÊ²Ã´ÓÐÒ»¸ö¡°²é¿´ÎÄÕÂÁÐ±í¡±µÄÁ´½ÓÏÔʾ¸øÓû§µã»÷£¿ÒòΪHATEOAS£º·þÎñ¶ËÔÚ·µ»ØÉÏÒ»¸ö״̬£¨×ÊÔ´£©µÄʱºò£¬»á·µ»ØËùÓÐÏàÁÚ״̬µÄHypermedia£¬ÆäÖоͰüÀ¨¡°²é¿´ÎÄÕÂÁÐ±í¡±Õâ¸öHypermedia¡£¿Í»§¶Ë»áչʾËùÓÐÏàÁÚ״̬µÄHypermedia¹©Óû§Ñ¡Ôñ¡£

°´ÕÕ´ÓǰÍùºóµÄ˳ÐòÊáÀíÒ»±é£º

¿Í»§¶ËÇëÇó¸ù×ÊÔ´

=> ·þÎñÆ÷·µ»Ø¸ù×ÊÔ´µÄ±íʾ£¬ÒÔ¼°ÏàÁÚ×ÊÔ´µÄHypermedia

=> ¿Í»§¶Ë½øÈë¡°¸ù×ÊÔ´¡±×´Ì¬£¨±ÈÈç˵£¬Õ¹Ê¾Ê×Ò³£©

=> ¿Í»§¶ËÏÔʾËùÓÐÏàÁÚ״̬µÄHypermedia¹©Óû§Ñ¡Ôñ£¨±ÈÈ磬ÔÚÊ×Ò³ÓÐÒ»¸öµ¼º½À¸£¬ÀïÃæÓм¸¸öÁ´½Ó£©

=> Óû§Ñ¡ÔñÁËij¸öHypermedia£¨±ÈÈ磬µã»÷ÁË¡°²é¿´ÎÄÕÂÁÐ±í¡±µÄÁ´½Ó£©

=> ¿Í»§¶ËÇëÇó¡°ÎÄÕÂÁÐ±í¡±×ÊÔ´

=> ·þÎñÆ÷·µ»Ø¡°ÎÄÕÂÁÐ±í¡±×ÊÔ´µÄ±íʾ£¬ÒÔ¼°ÏàÁÚ×ÊÔ´µÄHypermedia

=> ¿Í»§¶Ë½øÈë¡°ÎÄÕÂÁÐ±í¡±×´Ì¬

=> ¿Í»§¶ËÏÔʾËùÓÐÏàÁÚ״̬µÄHypermedia¹©Óû§Ñ¡Ôñ£¨±ÈÈ磬ÔÚÎÄÕÂÁбíÀÏÔʾËùÓÐÎÄÕµÄÁ´½Ó£©

¡­¡­

²»ÄÑ·¢ÏÖ£¬¿Í»§¶Ë½ÓÊÕµ½Ò»¸öеÄ×ÊÔ´±íʾ£¬¾Í»áÌø×ªµ½ÐµÄ״̬£¬Õâ¸ö¹ý³Ì³ÆÎª×´Ì¬´«Ê䣨·þÎñÆ÷¸ø¿Í»§¶Ë´«ÊäÐÂ״̬£©¡£Òò´Ë״̬´«ÊäÊÇͨ¹ý´«Êä×ÊÔ´±íʾÀ´Íê³ÉµÄ¡£

RESTµÄ×ÖÃæÒâ˼

Representational State TransferµÄÓï·¨½á¹¹ÊÇ(Representational (State Transfer))£¬ÔÚÕâÀïÎÒÃÇÓõÄÊÇrepresentationµÄÐÎÈÝ´ÊÐÎʽ£¬Òâ˼ÊÇÔÚ±íʾ²ãÉϵÄ״̬´«Êä¡£Õâ¸ö´ÊµÄ×ÖÃæÒâ˼ÊÇͨ¹ý´«Êä×ÊÔ´±íʾÀ´´«Êä¿Í»§¶Ë״̬¡£

RESTµÄ×ÖÃæÒâ˼ÔÚÍøÂçÉÏÓкܶàÖÖÀí½â£¬ÎҲο¼ÁËijλ´ðÖ÷µÄÁ½¸ö»Ø´ð£ºhttps://stackoverflow.com/a/1... ºÍ https://stackoverflow.com/a/4... £¬ÒòΪÕâλ´ðÖ÷µÄ»Ø´ð×î·ûºÏwikipediaµÄ½âÊÍ£º"The term is intended to evoke an image of how a well-designed Web application behaves: it is a network of Web resources (a virtual state-machine) where the user progresses through the application by selecting links, such as /user/tom, and operations such as GET or DELETE (state transitions), resulting in the next resource (representing the next state of the application) being transferred to the user for their use."

×ܽá

ÖÁ´Ë£¬ÎÒÃÇÓ¦¸ÃÄܹ»Ìå»áµ½RESTÒѾ­²»½ö½öÊÇÒ»ÖÖAPI·ç¸ñÁË£¬ËüÊÇÒ»ÖÖÈí¼þ¼Ü¹¹·ç¸ñ(REST±¾Éí²»ÊÇÒ»Öּܹ¹)¡£REST·ç¸ñµÄÈí¼þ¼Ü¹¹¾ßÓкÜÇ¿µÄÑÝ»¯¡¢ÍØÕ¹ÄÜÁ¦£º

Ò»ÖµÄURLºÍHTTP¶¯´ÊʹÓãºÈ·±£ÏµÍ³Äܹ»½ÓÄɶàÑù¶øÓÖ±ê×¼µÄ¿Í»§¶Ë£¬±£Ö¤¿Í»§¶ËµÄÑÝ»¯ÄÜÁ¦¡£

ÎÞ״̬£º±£Ö¤ÁËϵͳµÄºáÏòÍØÕ¹ÄÜÁ¦¡¢·þÎñ¶ËµÄÑÝ»¯ÄÜÁ¦¡£

HATEOAS£º±£Ö¤ÁËÓ¦Óñ¾ÉíµÄÑÝ»¯ÄÜÁ¦(¹¦ÄÜÔö¼Ó¡¢¸Ä±ä)¡£

Õâ3µãÊǵ¥µ¥¶ÔÑÝ»¯ÍØÕ¹ÓÅÊÆµÄ˵Ã÷£¬Õâ¸ö»Ø´ð×ܽáÁËRESTµÄ6¸öÔ¼Êø·Ö±ð¶ÔÓ¦µÄÓŵ㡣

   
3664 ´Îä¯ÀÀ       27
Ïà¹ØÎÄÕÂ

ÆóÒµ¼Ü¹¹¡¢TOGAFÓëArchiMate¸ÅÀÀ
¼Ü¹¹Ê¦Ö®Â·-ÈçºÎ×öºÃÒµÎñ½¨Ä££¿
´óÐÍÍøÕ¾µçÉÌÍøÕ¾¼Ü¹¹°¸ÀýºÍ¼¼Êõ¼Ü¹¹µÄʾÀý
ÍêÕûµÄArchimateÊÓµãÖ¸ÄÏ£¨°üÀ¨Ê¾Àý£©
Ïà¹ØÎĵµ

Êý¾ÝÖÐ̨¼¼Êõ¼Ü¹¹·½·¨ÂÛÓëʵ¼ù
ÊÊÓÃArchiMate¡¢EA ºÍ iSpace½øÐÐÆóÒµ¼Ü¹¹½¨Ä£
ZachmanÆóÒµ¼Ü¹¹¿ò¼Ü¼ò½é
ÆóÒµ¼Ü¹¹ÈÃSOAÂ䵨
Ïà¹Ø¿Î³Ì

ÔÆÆ½Ì¨Óë΢·þÎñ¼Ü¹¹Éè¼Æ
ÖÐ̨սÂÔ¡¢ÖÐ̨½¨ÉèÓëÊý×ÖÉÌÒµ
ÒÚ¼¶Óû§¸ß²¢·¢¡¢¸ß¿ÉÓÃϵͳ¼Ü¹¹
¸ß¿ÉÓ÷ֲ¼Ê½¼Ü¹¹Éè¼ÆÓëʵ¼ù