ÃüÁîºÍ²éѯÔðÈηÖÀ루CQRS£©ÊÇÓÉGreg YoungÌá³öµÄÒ»ÖÖ½«ÏµÍ³µÄ¶Á£¨²éѯ£©¡¢Ð´£¨ÃüÁ²Ù×÷·ÖÀëΪÁ½ÖÖ¶ÀÁ¢×ÓϵͳµÄ¼Ü¹¹Ä£Ê½¡£ÃüÁîͨ³£ÊÇÒì²½Ö´Ðе쬲¢´æ´¢ÔÚÒ»¸öÊÂÎñÐÍÊý¾Ý¿âÖУ¬¶ø¶Á²Ù×÷Ôòͨ³£ÊÇ×îÖÕÒ»Öµģ¬²¢ÇÒÊý¾ÝÀ´×ÔÓÚ½âÕý¹æ»¯µÄÊÓͼ¡£
±¾ÎÄÔÚ´ËÌá³ö²¢Îª¶ÁÕßչʾһÖÖΪCQRSϵͳ´´½¨Ò»Ì×RESTful APIµÄ·½Ê½¡£ÕâÖÖ·½Ê½½áºÏÁËHTTPµÄÓïÒå¡¢REST
API»ùÓÚ×ÊÔ´µÄ·ç¸ñ£¬²¢Äܹ»´¦Àí·Ö²¼Ê½¼ÆËãµÄijЩÎÊÌ⣬ÀýÈç×îÖÕÒ»ÖÂÐԺͲ¢·¢ÐÔ¡£
´ËÍâÎÒÃÇ»¹ÌṩÁËÒ»Ì×ÔÐÍAPI£¬Ëü½¨Á¢ÓÚGreg Young±àдµÄm-r CQRSÔÐÍÖ®ÉÏ£¬ºóÕßÒ²±»³ÆÎªSimplestPossibleThing¡£m-r¿ÉÒÔÈÏΪÊÇCQRSÔÐ͵ÄÊÂʵ±ê×¼£¬Ëü¹ÄÎèÁËÐí¶àÍŶӲÉÓò¢´´½¨CQRSϵͳ¡£ËäÈ»Õâ¸öm-rÔÐͺܼòµ¥£¬µ«ËüÒѾÄܹ»Õ¹Ê¾ÔÚÏÖʵÊÀ½çÖÐʹÓÃRESTful
CQRSϵͳµÄijЩ»úÓöºÍÌôÕ½ÁË¡£
ÎÒÃÇÔÚ½«ÏÂÒ»²¿·ÖÉóÔÄm-rµÄÁìÓòÄ£ÐÍ£¬Ëæºó¶ÔÏà¹ØÌØÐÔµÄAPIÉè¼Æ½øÐÐһЩ̽Ë÷¡£×îºó£¬ÎÒÃǽ«¶ÔһЩËù×öµÄÑ¡ÔñÕ¹¿ªÌÖÂÛ£¬²¢ÇÒÌÖÂÛһЩRESTful
m-rµÄ¸ÅÄîºÍÀíÂÛÄÚÈÝ¡£
m-rÁìÓò
m-rÄ£ÐÍÊÇÒ»¸ö¾¹ý¼ò»¯µÄ¿â´æ¹ÜÀíϵͳµÄÁìÓòÄ£ÐÍ£¬Äã¿ÉÒÔ´´½¨ÐÂ¿â´æÎïÆ·£¨¼ÙÉèËüÊÇijÖÖÀàÐ͵IJúÆ·£©£¬ÖØÃüÃû»òÈ¡Ïû¼¤»î£¨¼´Â߼ɾ³ý£©ËüÃÇ¡£±»È¡Ïû¼¤»îµÄÎïÆ·½«²»ÔÙΪÓû§Ëù¼û£¬¶øËùÓлµÄÎïÆ·¶¼¿ÉÒÔ±»»ñÈ¡£¬²¢ÇÒÄܹ»¿´µ½Ã¿¸öÎïÆ·µÄËùÓÐϸ½Ú¡£ÄãÒ²Äܹ»Ôö¼Ó»ò¼õÉÙÕâЩ¿â´æÎïÆ·£¬Ö¸¶¨Ëù¼ÓÈë»ò¼õÉÙµÄÎïÆ·Êý¾Ý¡£»»¾ä»°Ëµ£¬ÔÚ½¨Á¢¿â´æÁ¿Ö®ºó£¬¾Í¿ÉÒÔ¿ªÊ¼Ê¹ÓÃÕâ¸öϵͳÁË¡£
Óû§½«Í¨¹ýͬ²½µÄ²éѯÀ´²é¿´ÎïÆ·Áбí»òÊÇÎïÆ·Ï¸½Ú£¬¶ÔÓÚÎïÆ·×´Ì¬µÄÐ޸Ľ«Í¨¹ýÃüÁîÀ´ÊµÏÖ¡£ÔÚÏÖʵÊÀ½çÖУ¬ÃüÁîÓ¦¸ÃÊÇÒì²½Ö´Ðе쬵«ÓÉÓÚ´úÂëÖÐʹÓÃÁËÄÚ´æÖеÄʼþ×ÜÏߣ¨Event
Bus£©¼°Ê¼þ´¦Àíº¯Êý£¬Òò´ËÔÚ×îÖÕʵÏÖÖÐÃüÁî¶¼ÊÇͬ²½Ö´Ðеġ£

m-rÄ£ÐÍʵÏÖÁËCQRS£ºÃüÁîºÍ²éѯ±»·Ö±ð´æ´¢ÔÚ²»Í¬µÄµØ·½£¬²¢ÇÒ¸÷×ÔÓÉϵͳÖÐÍêÈ«²»Í¬µÄ²¿·Ö½øÐд¦Àí¡£
³ýÁËCQRSÖ®Í⣬m-rҲʹÓÃÁËʼþËÝÔ´£¨Event Sourcing£©×÷ΪËüµÄ³Ö¾Ã»¯»úÖÆ¡£ÔÚÕâÖÖ·½Ê½ÖУ¬¶ÔÓÚÁìÓòÄ£Ð͵ÄÐ޸Ļᱻ²¶»ñΪһϵÁеÄʼþ£¬ÕâЩʼþ»á°´ÕÕËüÃDZ»µ÷ÓõÄ˳Ðò´æ´¢ÆðÀ´¡£ÎªÁË»ñȡij¸öÄ£Ð͵ĵ±Ç°×´Ì¬£¬ÐèÒª½«ËùÓÐʼþ°´ÕÕËüÃÇ·¢ÉúµÄ˳Ðò½øÐÐÖØ²¥¡£»»¾ä»°Ëµ£¬Ä£ÐÍÖÐʵÌåµÄ״̬ÐÅÏ¢ÊDz»»á±»³Ö¾Ã»¯µÄ¡£¾ÙÀýÀ´Ëµ£¬Èç¹ûÎÒÃÇ´´½¨ÁËÒ»¸ö¿â´æÎïÆ·£¬Ëæºó½«ËüÖØÃüÃûÁ½´Î£¬ÄÇôÎÒÃǽ«»áµÃµ½Ò»¸öInventoryItemCreatedʼþºÍÁ½¸öInventoryItemRenamedʼþ£¬ÕâЩʼþ¶¼»á±»±£´æÔÚʼþ´æ´¢£¨Event
Store£©ÖС£
ʼþÊÇÁ¬ÐøµÄ£¬²¢ÇÒÿ¸öʼþ¶¼´øÓÐÒ»¸ö°æ±¾ºÅ£¬ÓÃÒÔÔÚ²¢·¢Ê±½øÐмì²é¡£¾ÙÀýÀ´Ëµ£¬Èç¹ûij¸ö¿â´æÎïÆ·ÔÚ°æ±¾2µÄ»ù´¡ÉϽøÐÐÖØÃüÃû£¬µ«ÕýºÃÓÐÁíÒ»¸öÖØÃüÃû·¢ÉúÔÚͬһ¸öÎïÆ·ÉÏ£¬²¢Ê¹ËüµÄµ±Ç°°æ±¾±äΪ3£¬ÄÇôÕâÖÖÇé¿ö¾Í»áµ¼Ö²¢·¢Òì³£¡£
ÃüÁîÓëÁìÓòʼþͨ³£ÊÇÒ»¶ÔÒ»µÄ¹ØÏµ£¬µ±µ÷ÓÃÁËij¸öÃüÁîÖ®ºó£¬ÁìÓòÄ£ÐͻᷢÆð²¢´æ´¢Ò»¸öʼþ¡£ÁìÓòʼþÊÇʼþËÝÔ´µÄ»ùʯ£¬ËüºÍ¿ç¶à¸ö±ß½çÉÏÏÂÎÄ£¨bounded
context£©µÄʼþ²»Í¬£¬ÍùÍùÁ£¶È¸üϸ£¬²¢ÇÒÖ»°üÀ¨ËùÐèµÄ×îСÊýÁ¿µÄÐÅÏ¢¡£Òò´Ë£¬Ëü²¢²»ÊÇÒ»¸öÊʺÏÓÚÔÚ²»Í¬µÄ±ß½çÉÏÏÂÎÄÖ®¼ä½øÐм¯³ÉµÄ¹¤¾ß¡£³ýÁËʹÓÃÒ»¸ö½ø³ÌÄÚµÄʼþ×ÜÏßÖ®Í⣬m-r»¹Óõ½ÁËÒ»¸öÄÚ´æÖеÄʼþ´æ´¢¡£Õâ¸ö´æ´¢±¾ÖʾÍÊÇÒ»¸ö¹þÏ£±í£¬ËüʹÓÃÄ£Ð͵Äid×÷Ϊ¼ü£¬²¢ÇÒ³ÖÐø¸ú×ÙÄ£ÐÍÖз¢ÉúµÄÈκÎʼþ¡£
ÈçÓûÁ˽âCQRSºÍʼþËÝÔ´µÄ¸ü¶àÐÅÏ¢£¬Äã¿ÉÒÔÔĶÁGreg YoungµÄÕâ±¾ÃÔÄãÊé¡£
´´½¨Ò»Ì×ÉϲãµÄREST API
Èç¹ûÄãÇãÏòÓÚÏÈÈ¥¸ÐÊÜÒ»ÏÂ×îÖÕµÄʵÏÖ£¬¿ÉÒÔÔÚÕâÀï¿´Ò»ÏÂÒ»¸öĿǰ£¨ÔÝʱÐÔ£©¿ÉÔËÐеÄÔÐÍ¡£ÎÒÃǹÄÀøÄãʹÓÃfiddler»òÕßä¯ÀÀÆ÷×Ô´øµÄ¿ª·¢¹¤¾ßÈ¥¼ì²éÒ»ÏÂÕâ¸ö¼òµ¥µÄʾÀýÖеÄHTTPÇëÇó¡£ÔÚGitHubÉÏ¿ÉÒÔÕÒµ½°üÀ¨ÕâÌ×APIºÍÒ»¸ö»ù±¾µÄAngularÓ¦ÓõÄÔ´´úÂë¡£²»¹ýÎÒÃÇ»¹ÊÇҪǿµ÷£¬ËüµÄʵÏÖ·½Ê½ºÍʹÓõļ¼Êõ²¢·Ç¹Ø¼üËùÔÚ£¬¶ÁÕ߸üÓ¦¸Ã¹Ø×¢ÓÚÉè¼Æ·½Ê½¼°HTTPµÄÕ¹ÏÖ¡£
¹«¿ªÁìÓòµÄ¹¹Ôì
¶ÔÓÚÕâ¸öAPI²ãÀ´Ëµ£¬×îÖØÒªµÄÔðÈÎÊǽ«µ×²ãµÄÁìÓò½¨Ä£Îª×ÊÔ´£¬²¢Í¨¹ýHTTPÓïÒ屩¶³öÀ´¡£ÔÚÕâ¸ö¹ý³ÌÖУ¬API²ã½«´´½¨Ò»¸ö¹«¹²ÁìÓò£¬ËüÓÉ×ÊÔ´£¨ÒÔ¼°ËüÃǵÄΨһ±êʶ·û->URL£©ÒÔ¼°ÊäÈëºÍÊä³öµÄÏûÏ¢Ëù¹¹³É¡£µ×²ãµÄÁìÓòÔ½¼òµ¥£¬Õâ¸ö¹«¿ªÁìÓòºÍµ×²ãÁìÓòµÄÏàËÆ³Ì¶È¾ÍÔ½¸ß¡£

ÔÚÕâ¸öÀý×ÓÖУ¬ÎÒÃÇ´´½¨µÄ¹«¿ªÁìÓòÓëµ×²ãµÄÁìÓò»¹ÊDZȽÏÏàËÆµÄ£¬µ«¼´Ê¹ÊÇÕâÖÖ¼òµ¥µÄÁìÓò£¬ÎÒÃÇÒ²²»Äܹ»Ö±½Ó½«µ×²ãµÄÁìÓò±©Â¶³öÈ¥£ºÕâ¿ÉÄÜÔì³ÉÁìÓòµÄÄÚ²¿ÊµÏÖ±»Ð¹Â©³öÈ¥£¬¶øÇÒÁìÓòÄÚ²¿Ò²²»Ò»¶¨°üº¬API²ãËùÐèµÄÈ«²¿ÊôÐÔ¡£±È·½Ëµ£¬ËùÓеÄÄÚ²¿ÃüÁî¶¼»áÓÃÒ»¸öÕûÊýÀ´±íʾ²¢·¢Ê±ËùÐèµÄ°æ±¾ºÅ£¬¶øÔÚ¹«¿ªÁìÓòÖÐÔòÓÃ×Ö·û´®±íʾÕâ¸öÊôÐÔ¡£ÎÒÃÇÉԺ󽫻áʹÓÃÕâ¸öÊôÐÔ×÷ΪETag£¬¶ø¸ù¾ÝHTTP¹æ¸ñÒªÇó£¬ETag±ØÐëÊDz»Í¸Ã÷µÄ¡£
¼òµ¥À´Ëµ£¬ÎÒÃÇËù´´½¨µÄ¹«¿ªÁìÓò±íÏÖÁËÄÚ²¿µÄÁìÓòÀ࣬µ«ÓÖ²»ÍêÈ«Ïàͬ¡£ÕâÖÖ¹«¿ªÁìÓòͨ³£±»³ÆÎªÒ»¸öÊÓͼģÐÍ£¨Vide
Model£©¡£Õâ¸öÊõÓï²¢²»Ì«×¼È·£¬ÒòΪÕâÖÖ±í´ï·½Ê½¸Ð¾õÉ϶Թ«¿ªÁìÓòÓÐЩÅų⣬½«ËüÊÓΪһÖÖ¡°ÑÆ¡±Ä£ÐÍ£¬Òò´ËÎÒÃÇÇãÏòÓÚʹÓÃÒ»¸öÐÂÊõÓï¡°Êä³öÄ£ÐÍ¡±£¨output
model£©¡£Ëü½«±»Ó¦Óõ½ÊäÈëºÍÊä³öÏûÏ¢ÖУ¨ÃüÁîºÍÊä³öÄ£ÐÍ£©¡£
×ÊÔ´
ÎÒÃǺÜ×ÔÈ»µØÏëµ½Ó¦¸ÃÓÐÒ»¸öInventoryItem×ÊÔ´£¬Òò´ËÎÒÃǽ«ÁìÓòÖеÄÕâ¸öµ¥¸ùʵÌ屩¶Ϊһ¸öµ¥¶ÀµÄ×ÊÔ´£¬¿ÉÒÔÓÃ/api/InventoryItem·½±ãµØ½øÐбíʾ¡£Ã¿¸ö¿â´æÎïÆ·½«ÓÃ/api/InventoryItem/{id}½øÐбíʾ£¬m-rʹÓÃÁËÈ«¾ÖΨһ±êʶ·û£¨GUID£©×÷ΪId¡£
ʹÓÃÕâ¸öµ¥¶ÀµÄ¸ù¶ÔÏó¾Í¿ÉÒÔÍêÕûµÄ±íÏÖÎÒÃǵÄÁìÓòÁË¡£»¹ÓÐÒ»ÖÖ·½Ê½ÊÇʹÓÃ/api/InventoryItem/{id}/StockÕâ¸ö×ÊÔ´×÷ΪÌí¼ÓºÍɾ³ý¿â´æÁ¿£¨¼´Ç©Èë»òÒÆ³ýÎïÆ·£©µÄ·½·¨¡£´Ó±¾ÖÊÉÏ˵ËüÃÇûÓÐʲô¸ßÏÂÖ®·Ö£¬ÎÞ·ÇÊÇÄÄÖÖ·½Ê½Äܹ»¸üºÃµØ±íÏÖ×ÊÔ´¶øÒÑ¡£ÓÉÓÚµÚÒ»ÖÖ·½Ê½¸ü¼Ó¼ò±ã£¬Òò´ËÎÒÃǾÍʹÓÃÕâÖÖ·½Ê½¡£

²éѯ
ÎÒÃÇÐèÒªÁ½¸ö²éѯ£ºGetInventoryItemsºÍGetInventoryItemDetails¡£ÕâÀïÎÒÃǽ«Í¨¹ýÁ½¸öGET·½·¨/api/InventoryItemºÍ/api/InventoryItem/{id}±©Â¶³öÕâÁ½¸ö²éѯ¹¦ÄÜ¡£
GetInventoryItems·½·¨Äܹ»»ñÈ¡½ö°üº¬ÁËÎïÆ·Ãû³ÆºÍIdµÄÒ»¸öÁÐ±í£¬Ëü»á¸ù¾ÝACCEPTÍ·¾ö¶¨·µ»ØJSON»òÊÇXML£¨ASP.NET
Web APIÄܹ»Ö§³ÖÕâÒ»¹¦ÄÜ£©¡£Èç¹ûij¸ö×ÊÔ´ÊʺÏÓÚ»º´æ£¬ÄÇôËùÓеÄGETÇëÇó¶¼ÓпÉÄÜ·µ»Ø»º´æÊý¾Ý¡£GetInventoryItems·µ»ØInventoryItemListDataCollection×÷ΪÊä³öÏûÏ¢¡£ËäÈ»¿ÉÒÔͨ¹ýÊý¾ÝÄÚÈݵĹþÏ£Éú³ÉETag£¬²»¹ýÕâÀïÎÒÃÇÑ¡Ôñ½«ÁбíÖÐÿһÏîµÄIdºÍÃû³Æ½øÐйþÏ£ºóµÃµ½µÄ½á¹û×÷ΪETag·µ»Ø¸ø¿Í»§¶Ë£¨ÀýÈçä¯ÀÀÆ÷£©¡£¿Í»§¶Ë¿ÉÒÔÑ¡Ôñ½«×ÊÔ´»º´æÆðÀ´£¬²¢Õë¶ÔETagʹÓÃIf-Non-Match½øÐÐÌõ¼þÇëÇó¡£ÎÒÃÇÑ¡Ôñ½«×ÊÔ´µÄmax-ageÉèΪ0£¬Òò´Ë¿Í»§¶ËµÄGET»áʼÖÕʹÓÃÌõ¼þÇëÇ󣬲»¹ýÒ²¿ÉÒÔÑ¡ÔñÉèÖÃÒ»¸öÈËΪµÄ¹ýÆÚʱ¼ä¡£
GET /api/InventoryItem HTTP/1.1 Accept:application/json, text/plain, */* Accept-Encoding:gzip,deflate,sdch If-None-Match:"LdHipfxR7BsfBI3hwqt2BLsno8ic98KmrIA1y67Nnw4=" |
·µ»Ø½á¹û
HTTP/1.1 304 Not Modified ETag: "LdHipfxR7BsfBI3hwqt2BLsno8ic98KmrIA1y67Nnw4=" |
GetInventoryItemDetails·½·¨»á·µ»ØÄ³¸ö¿â´æÎïÆ·µÄϸ½Ú£¬°üÀ¨Id£¬NameºÍCurrentCountÊôÐÔ£¬×îºóÒ»ÏîÊôÐԼǼÁ˵±Ç°µÄ¿â´æÊýÁ¿¡£ËäÈ»ÄÚ²¿ÁìÓòµÄ¶ÁȡģÐÍ£¨read
model£©°üº¬Á˰汾ºÅ£¬µ«Èç¹û½«Ä³¸öÊýÖµÀàÐ͵İ汾ºÅÖ±½Ó×÷ΪETag»á²úÉú°²È«ÐÔÎÊÌ⣬ÒòΪ¿Í»§¶Ë¿ÉÒÔÇáÒ׵ز³öÏÂÒ»¸öÊýÖµ¡£Òò´Ë£¬ÎÒÃÇÑ¡ÔñÁËʹÓø߼¶¼ÓÃܱê×¼£¨AES£©¶Ô°æ±¾ºÅ½øÐмÓÃܺó£¬×÷ΪInventoryItemDetails·½·¨µÄETagÊä³ö¡£
Ϊÿ¸ö²Ù×÷¶¼ÖØÐÂʵÏÖETag¶ÔÓÚAPI²ãÀ´ËµÓÐЩ¸ºµ£¹ýÖØ£¬Òò´ËÎÒÃǶ¨ÒåÁËÒ»¸öIConcurrencyAware½Ó¿Ú£º
public interface IConcurrencyAware { string ConcurrencyVersion { get; set; } } |
ÿ¸öÖ§³ÖETagµÄÊä³öÄ£ÐͶ¼ÒªÊµÏÖÕâ¸ö½Ó¿Ú£¬µ±API²ã¿´µ½Ä³¸öÊä³öÄ£ÐÍÖ§³ÖÕâ¸ö½Ó¿Úʱ£¬¾Í»á¶ÁÈ¡°æ±¾ºÅ²¢ÉèÖÃETagÖµ¡£ÁíÒ»·½Ã棬µ±API²ã¶ÔÌõ¼þʽGETÇëÇó½øÐÐÏìӦʱ£¬»á½«Éú³ÉµÄETagÓë¿Í»§¶ËÔÚIf-None-MatchÍ·Öд«ÈëµÄÖµ½øÐбȽϡ£ËùÓÐÕâЩ²Ù×÷¶¼¿ÉÒÔͨ¹ýÒ»¸öµ¥¶ÀµÄÈ«¾ÖfilterʵÏÖ£ºConcurrencyAwareFilter¡£
ÐèҪעÒâµÄÊÇ£¬Ìí¼Ó¡¢É¾³ý»òÕßÖØÃüÃûij¸ö¿â´æÎïÆ·Ê±Ó¦¸ÃʹÎïÆ·ÁбíµÄ»º´æÊ§Ð§¡£Çë¿´ÏÂÃæµÄÀý×Ó£¨Ìõ¼þʽGETÇëÇóµÄÂß¼ÊÇÔÚä¯ÀÀÆ÷¶ËÍê³ÉµÄ£¬²»ÐèÒªÌØ±ð±àд´úÂëʵÏÖ£©£º
GET /api/InventoryItem HTTP/1.1 If-None-Match:"CWtdfNImBWZDyaPj4UjiQr/OrCDIpmjVhwp8Zjy+Ok0=" |
·µ»Ø½á¹ûÊÇÒ»¸ö״̬ÂëΪ200µÄÍêÕûÏìÓ¦£¬²¢ÇÒ°üº¬ÁËÒ»¸öеÄETagÖµ£º
HTTP/1.1 200 OK Cache-Control:max-age=0, private Content-Length:68 ETag:"0O/961NRFDiIwvl66T1057MG4jjLaxDBZaZHD9EGeks=" Content-Type:application/json; charset=utf-8; domain- model=InventoryItemListDataCollection; version=1.0.0.0; format=application%2fjson; schema=application%2fjson; is-text=true ... |
Çë×¢ÒâContent-TypeÍ·°üº¬Á˶îÍâµÄ²ÎÊý£¬ÕâÊǶÔÓÚ¡°Ã½ÌåÀàÐ͵ÄÎåÖÖ¼¶±ð¡±£¨»òÕß¼ò³Æ5LMT£©¸ÅÄîµÄÒ»ÖÖʵÏÖ£¬ÕâÖÖ·½Ê½²»Êǽ«ËùÓÐÐÅÏ¢¶¼Èûµ½Ò»¸öµ¥¶ÀµÄÁîÅÆ£¨token£©ÖУ¬¶øÊÇʹÓò»Í¬µÄ²ÎÊýÀ´±í´ï¶ÔÓû§ÓÐÓõIJ»Í¬¼¶±ðµÄÊý¾Ý£¬Äܹ»±í´ï²»Í¬¼¶±ðµÄÓÐÓÃÐÅÏ¢¡£ÏÂÎÄ»á¶ÔÕâ¸öÖ÷Ìâ×ö½øÒ»²½µÄÌÖÂÛ¡£
ÃüÁî
²éѯͨ³£»áÓ³Éäµ½GET·½·¨£¬¶øÃüÁîÔòÐèÒªÓ³Éäµ½POST¡¢PUT¡¢DELETEºÍPATCH·½·¨¡£½«HTTPν´ÊÓ³Éäµ½CRUD²Ù×÷ÊÇÒ»ÖÖÁ÷ÐеĹÛÄµ«ÔÚÕæÊµÊÀ½çÖкÜÉÙÄܹ»½«Î½´ÊºÍÊý¾Ý¿â²Ù×÷Ò»Ò»¶ÔÓ¦¡£Êµ¼ÊÉÏ£¬REST
API²¢²»ÔڶԳ־û¯´æ´¢Ö®ÉϵÄÒ»¸ö¼òµ¥·â×°£¬Ïà·´£¬ËüÊÇÖ¸ÒýÓû§È¥Á˽âÒµÎñÁìÓò¡¢²Ù×÷Ó빤×÷Á÷µÄÒ»ÉÈÃÅ¡£Òò´ËËü±ØÐëÄܹ»²»ÒÀÀµÓÚÌØ¶¨µÄν´ÊÈ¥±í´ïij¸öά¶ÈµÄÒâͼ¡£
Ò»ÖÖ³£¼ûµÄ·½Ê½ÊÇʹÓÃÔ¶³Ì¹ý³Ìµ÷Óã¨RPC£©·ç¸ñµÄ×ÊÔ´£¬ÀýÈç/api/InventoryItem/{id}/rename¡£ËäÈ»Ëü¿´ÉÏȥȷʵȥ³ýÁ˶ÔijÖÖν´ÊµÄÒÀÀµ£¬µ«ËüÎ¥·´ÁËRESTÃæÏò×ÊÔ´µÄ±íÏÖÄÜÁ¦¡£ÎÒÃÇÐèÒª¼Çס£¬×ÊÔ´ÊÇÒ»¸öÃû´Ê£¬HTTPν´ÊÔò±íʾ¶¯´ÊºÍ¶¯×÷£¬¶ø×ÔÃèÊöµÄÏûÏ¢£¨RESTµÄ×ÚÖ¼Ö®Ò»£©ÔòÊDZí´ïÆäËüά¶ÈÐÅÏ¢ºÍÒâͼµÄÊֶΡ£Êµ¼ÊÉÏ£¬ÔÚHTTPÏûÏ¢ÖÐËù°üº¬µÄÃüÁî¾ÍÓ¦¸Ã×ãÒÔÃèÊöÈκÎÈËΪµÄ²Ù×÷ÁË¡£µ«ÊÇ£¬ÍêÈ«ÒÀÀµÓÚÇëÇóÌåÖеÄÏûÏ¢Ò²ÓÐËü×Ô¼ºµÄÎÊÌ⣬ÒòΪÇëÇóÌåͨ³£ÊÇ×÷ΪÁ÷´«µÝµÄ£¬ÒªÔÚ±çÈϳöËüµÄ¾ßÌå²Ù×÷֮ǰ»ñÈ¡Õû¸öÇëÇóÌåÓÐʱÊDz»¿ÉÄÜ×öµ½µÄ£¬¶øÇÒÕâÒ²²»ÊÇÒ»ÖÖÃ÷ÖǵÄ×ö·¨¡£ÕâÀÎÒÃǽ«Õ¹Ê¾Ò»ÖÖ»ùÓÚ5LMTÖеĵÚ4¼¶±ð£¨¼´ÁìÓòÄ£ÐÍ£©´¦ÀíÇëÇóµÄ·½Ê½£¬ÃüÁîµÄÀàÐͽ«°üº¬ÔÚContent-TypeÍ·ÖеÄij¸ö²ÎÊýÄÚ¡£
PUT /api/InventoryItem/4454c398-2fbb-4215-b986-fb7b54b62ac5 HTTP/1.1 Accept:application/json, text/plain, */* Accept-Encoding:gzip,deflate,sdch Content-Type:application/json;domain-model=RenameInventoryItemCommand |
ÕâÑù¾ÍÄܹ»½«ÇëÇóÕýÈ·µØÊäË͸ø·þÎñ¶ËÏàÓ¦µÄ´¦Àí·½·¨ÁË¡£ÄÇÕâÖÖ·½Ê½ÊÇ·ñ½«¹ý¶àµÄÐÅϢй¶¸ø¿Í»§¶ËÁËÄØ£¿²¢·ÇÈç´Ë¡£ÊäÈëÊä³öÏûÏ¢µÄschema£¨ÒÔ¼°Ãû³Æ£©Êǹ«¿ªÁìÓòµÄÒ»²¿·Ö£¬¿Í»§¶Ë±ØÐëÄܹ»ÍêÕûµØ·ÃÎʵ½Ëü£¬Òò´ËËüÃÇÒÀÀµÓÚschemaÒ²ÊÇÔÚÎÒÃÇËùÔ¤ÆÚµÄ¡£
ÖÁÓÚ¿Í»§¶ËµÄʵÏÖÖ»ÓÃÁË×îÉÙÁ¿µÄ´úÂ룬ÕâÀïʹÓÃÁËÒ»¸öAngularJSµÄ×°ÊΣ¨decorator£©·â×°ÁË$http·þÎñ£¬ËüÄܹ»¶ÁÈ¡Õâ¸öÔÐ͵ķµ»ØÄÚÈÝ£¬²¢ÇÒÄܹ»ÔÚContent-TypeÍ·ÖмÓÈë¶îÍâµÄ²ÎÊýÐÅÏ¢¡£Ö»Òª±£³ÖJavaScript¹¹Ô캯ÊýµÄÃû³Æ²»±ä¾ÍûÓÐÎÊÌâ¡£
ÎÒÃÇÒѾ½â¾öÁ˱æÈϵ±Ç°Õý±»µ÷Óõķ½·¨µÄÎÊÌ⣬½ÓÏÂÀ´ÐèÒª½«ÃüÁî°´ÕÕÓïÒåÓ³Éäµ½ÏàÓ¦µÄHTTPν´Ê¡£ÔÚ½«ÃüÁîÓ³É䵽ν´Êʱ£¬Ñ¡ÔñÕýȷν´ÊµÄ¹Ø¼ü²»½ö½öÔÚÓÚÓïÒ壬ͬÑùÒª¿¼ÂÇÃݵÈÐÔ£¨ÖÁÓÚν´ÊµÄ°²È«ÐÔÔòÎÞÐè¹Ë¼É£¬ÒòΪÈκÎÒ»¸öÃüÁîν´Ê¶¼ÊDz»°²È«µÄ£©¡£PUT¡¢PATCHºÍDELETEÊÇÃݵȵ쬶øPOSTÔò²»ÊÇÃݵȵ썶à´Îµ÷ÓÃÒ»¸öÃݵȵÄν´ÊµÄ½á¹ûÓë½öµ÷ÓÃÒ»´ÎÊÇÏàͬµÄ£©¡£
CreateInventoryItemCommand
´ÓCRUD·¶Ê½µÄ½Ç¶ÈÀ´Ëµ£¬CreateInventoryItemCommandºÜ×ÔÈ»µØÊÊÓÃÓÚPOST·½·¨¡££¨ÕâÀïÖ»ÏÔÊ¾ÖØÒªµÄÍ·ÐÅÏ¢£©
POST /api/InventoryItem HTTP/1.1 Content-Type:application/json;domain-model=CreateInventoryItemCommand
{"name": "CQRS Book"}
|
·µ»ØµÄÏìÓ¦ÈçÏÂ:
HTTP/1.1 202 Accepted Location: http://localhost/SimpleCQRS.Api/api/InventoryItem/ 109712b9-c3d5-4948-9947-b07382f9c8d9 |
¸Ã²Ù×÷½«ÔÚlocationÍ·ÐÅÏ¢Öзµ»ØÕâ¸ö½«±»´´½¨µÄ¿â´æÎïÆ·£¨ÒòΪËùÓвÙ×÷¶¼ÊÇÒì²½Ö´Ðе쩵ÄURLµØÖ·¡£
DeactivateInventoryItemCommand
ÈçͬǰÎÄËùÊö£¬È¡Ïû¼¤»î¿â´æÎïÆ·¾Í´ú±íÒ»´ÎÂ߼ɾ³ý¡£´ËÍ⣬ɾ³ý²Ù×÷ÊÇÃݵȵģ¬ÒòΪ¶à´Îɾ³ýÒ»¸ö¿â´æÎïÆ·µÄЧ¹ûºÍÒ»´Îɾ³ýÊÇÒ»ÑùµÄ¡£Òò´ËÎÒÃǽ«Ê¹ÓÃDELETEÑ¡Ïî×÷ΪȡÏû¼¤»îij¸öÎïÆ·µÄ·½Ê½£¨¸Ã·½·¨´øÓÐÒ»¸ö¿ÕµÄ·½·¨Ì壩¡£
DELETE /api/InventoryItem/f2b75f21-001a-4eed-b8f3-35bf5e4e9b0d HTTP/1.1 Content-Type:application/json;domain-model=DeactivateInventoryItemCommand
{}
|
·µ»ØµÄÏìÓ¦ÈçÏÂ:
ËäȻҲ¿ÉÒÔÔÚ·½·¨ÌåÖд«µÝid£¬µ«ÔÚURLÖÐÒѾÌṩÁËidÐÅÏ¢¡£DeactivateInventoryItemCommand¹¹Ô캯ÊýµÄΨһְÔðÊÇÕýÈ·µØÉèÖÃdomain-modelÕâ¸ö²ÎÊý¡£
RenameInventoryItemCommand
RenameInventoryItemCommand±ÈÆðÆäËüÃüÁîÀ´Ëµ¸üÓÐȤһµã¡£Ê×ÏÈ£¬ÖØÃüÃûÒ»¸ö¿â´æÎïÆ·Ò²¾ÍÊǽøÐÐÐ޸ģ¬Òò´ËʹÓÃPUTν´ÊÊÇ×îºÏÊʵġ£ÁíÒ»·½Ã棬Èç¹ûÄãÕýÔÚÖØÃüÃûij¸öÎïÆ·Ê±£¬ÄãµÄͬÊÂÒ²ÔÚ³¢ÊÔ½«ÆäÖØÃüÃûΪÁíÒ»¸öÃû×ֵϰ»áÔõÑùÄØ£¿Õâ¾ÍÊÇÒ»¸ö²¢·¢ÎÊÌâ¡£HTTPͨ¹ýIf-Unmodified-SinceºÍIf-MatchÌṩÁ˶Ô×ÊÔ´½øÐв¢·¢ÐÞ¸ÄʱµÄ±£»¤»úÖÆ¡£ÒòΪÎÒÃÇʹÓÃÁËETag£¬Òò´Ë¾ÍÏàÓ¦µØÉèÖÃIf-Match£º
PUT /api/InventoryItem/f2b75f21-001a-4eed-b8f3-35bf5e4e9b0d HTTP/1.1 Content-Type:application/json;domain-model=RenameInventoryItemCommand If-Match:"DL1IsUoH709K+N5TXFzlQeQI5arO8r/U0SzXcRhuXLc="
{"newName": "CQRS Book 1"} |
AngularJsµÄcontroller»á´«µÝETagÖµ£¬²¢´«ÈëÄ£ÐÍÖУ¬Ö®ºóÔÚÌõ¼þʽPUTÇëÇóʱ½øÐÐʹÓá£ÈçÄãËù¼û£¬ETagµÄÖµ½ö½öÊǶÔÁìÓòÄ£ÐÍÖа汾ºÅµÄÒ»ÖÖ±íÏÖ£¬µ«ÎÒÃÇ¶ÔÆä½øÐмÓÃÜÒÔÂú×ãHTTP¹æ¸ñµÄÐèÒª¡£·þÎñ¶Ë»ñÈ¡µ½Õâ¸öÖµÖ®ºó½øÐнâÃܲ¢»¹Ô³É°æ±¾ºÅµÄÊýÖµ¡£Èç¹û°æ±¾ºÅ²»Æ¥Å䣬ÁìÓòÄ£Ð;ͻáÅ׳öÒ»¸öConcurrencyExceptionÒì³££¬ÔÚAPI²ãµÄConcurrencyExceptionFilterAttributeÀಶ»ñµ½Õâ¸öÒì³£Ö®ºó£¬»áÒÔHTTPÓïÒåµÄ·½Ê½±íÏÖ¸ÃÒì³£¡£
HTTP/1.1 412 Precondition Failed
Õâ¸öÀý×ӺܺõØËµÃ÷ÁËHTTPµÄ²¢·¢ÈçºÎÓëCQRSµÄ²¢·¢¼ì²é»úÖÆÏà½áºÏ¡£
CheckInItemsToInventoryCommandºÍRemoveItemsFromInventoryCommand
ÕâÁ½¸öÃüÁî¾Í¸ü¼ÓÓÐȤÁË¡£ÎÒÃǽ«Íù¿â´æÖмÓÈë»òɾ³ýһЩÎïÆ·¡£´Óij·½ÃæÀ´Ëµ£¬ÕâÖÖ²Ù×÷ÊÇ¶Ô¿â´æÎïÆ·µÄÊýÁ¿½øÐиüУ¬Òò´Ë¿ÉÒÔ½«ÆäʵÏÖΪһ¸öPUT£¨Ò²ÐíPATCH¸üºÏÊÊ£©·½·¨¡£µ«ÒòΪÕâÁ½¸öÃüÁî²¢·ÇÃݵȣ¨±ÈÈç˵£¬µ÷ÓÃCheckInItemsToInventoryCommandÁ½´ÎÓ¦¸ÃÌí¼ÓÁ½´Î¿â´æ£©£¬Òò´Ë×îÊʺϵÄν´Êʵ¼ÊÉÏÊÇPOST¡£
¿Í»§¶Ë½«ÔÚContent-TypeÍ·ÐÅÏ¢ÖеIJÎÊýÖÐÉèÖÃÁìÓòÄ£Ð͵ÄÃû³Æ£¬ÈçͬÎÒÃÇ֮ǰËù¼ûµÄÒ»Ñù¡£
POST /api/InventoryItem/f2b75f21-001a-4eed-b8f3-35bf5e4e9b0d HTTP/1.1 Content-Type:application/json;domain-model=CheckInItemsToInventoryCommand
{"count": "230"}
|
·µ»ØµÄÏìÓ¦ÊÇÒ»ÑùµÄ£º
HTTPµÄÆäËü·½Ãæ
ʵÏÖHTTPµÄһЩÆäËü·½ÃæÒ²»á´øÀ´Ò»Ð©ºÃ´¦£¬HEADÒ²ÊÇÒ»¸öÖØÒªµÄν´Ê£¬ËüµÄÏìÓ¦½á¹ûºÍGET·½·¨Ò»Ñù£¬µ«·µ»ØµÄÏìÓ¦ÌåÖв»°üÀ¨ÈκÎÄÚÈÝ¡£ÎÒÃÇΪËùÓÐGET×ÊÔ´¶¼ÊµÏÖÁËHEADν´Ê£¬ÀýÈ磺
HEAD /api/InventoryItem HTTP/1.1 Accept:application/json, text/plain, */* Accept-Encoding:gzip,deflate,sdch |
½«·µ»Ø
HTTP/1.1 200 OK ETag: "LdHipfxR7BsfBI3hwqt2BLsno8ic98KmrIA1y67Nnw4="
|
¾ßÌåÔÚʵÏÖÖлὫHEADÇëÇóתÏò¸øGET·½·¨µÄ´¦Àíº¯Êý£¬¶ø¿ò¼Ü±¾Éí»áÔÚ×îºó¸ºÔðÒÆ³ý·µ»ØµÄÄÚÈÝ¡£ÕâһϵÁÐʵÏÖ¶¼ÊÇ×Ô¶¯´¥·¢µÄ£¬Òò´ËÔÚÏìÓ¦ÖпÉÒÔÕýÈ·µØ»ñµÃETag¡£
ÁíÒ»¸öÐèҪʵÏÖµÄÖØÒªÎ½´ÊÊÇOPTIONS£¬Õâ¸öν´Ê¿ÉÒÔÓÃÒÔÉú³ÉAPIÎĵµ£¬²»¹ýÎÒÃÇÕâÀïÖ»ÊǼòµ¥µÄ·µ»Ø¸Ã×ÊÔ´Ö§³ÖµÄËùÓÐν´Ê£º
OPTIONS /api/InventoryItem/f2b75f21-001a-4eed-b8f3-35bf5e4e9b0d
HTTP/1.1
Ëü½«·µ»ØÈçÏÂÄÚÈÝ£º
HTTP/1.1 200 OK Allow: GET,POST,OPTIONS,HEAD,DELETE,PUT Content-Length: 46 Content-Type: application/json; charset=utf-8; domain-model=String%5b%5d; version=4.0.0.0; format=application%2fjson; schema=application%2fjson; is-text=true
["GET","POST","OPTIONS","HEAD","DELETE","PUT"] |
Çë×¢Ò⣬ÏìÓ¦ÖеÄAllowÍ·¶ÔÓÚOPTIONSÇëÇóÀ´ËµÊDZØÐëµÄ¡£²»¹ýHTTP¹æ¸ñ±¾Éí²¢Ã»ÓÐÖ¸¶¨OPTIONSÏìÓ¦ÌåÖоßÌåд·¨£¬Òò´ËÎÒÃǾͽ«ÔÊÐíµÄν´Ê×÷Ϊһ¸ö×Ö·û´®Êý×é·µ»Ø£¨×¢Ò⣬ÔÚdomain-model²ÎÊýÖеÄString[]ÊǾ¹ýUrlEncoded·½·¨±àÂëµÄ½á¹û£©¡£¿ÉÒÔÀûÓÃÕâ¸öν´ÊÉú³É·ûºÏ¸÷ÖÖschemaºÍÓïÑÔÐèÇóµÄAPIÎĵµ¡£
³ýÁËÕâЩ·½·¨Ö®ÍâµÄÈκε÷Óö¼»á·µ»ØÒ»¸ö·½·¨Î´ÕÒµ½£¨method not
found£©»òÕß405״̬Â룬ASP.NET Web API×ÔÉíÒѾʵÏÖÁËÕâÒ»¹¦ÄÜ£º
PUT /api/InventoryItem HTTP/1.1
{} |
Ëü½«·µ»Ø£º
HTTP/1.1 405 Method Not Allowed Allow: POST,GET,HEAD,OPTIONS
{"message":"Http Method not supported"} |
ÌÖÂÛ
ÕâÒ»²¿·Ö½«ÏêϸÐðÊöijЩÀíÂÛ¸ÅÄÒÔ¼°ÎÒÃǵľö¶¨ÖÐһЩ±È½ÏÀ§ÄÑ£¬»òÕß¿ÉÄÜÒýÆðÕùÒéµÄ²¿·Ö¡£
¿ÉÑ¡µÄ²¢·¢¼ì²é
ÔÚm-r×î³õµÄʵÏÖÖУ¬ËùÓÐÃüÁ³ýÁËCreateInventoryItemCommand£¬ËüÒѾÒþʽµØ°üº¬ÁËֵΪ0µÄ°æ±¾ºÅ£©¶¼°üº¬Ò»¸öÕûÊýÐ͵ÄCurrentVersion×ֶΡ£¶øÕâ¸ö°æ±¾Öн«ËüÃÇÐÞ¸ÄΪ¿ÉÑ¡µÄ£¨¼´C#ÖеĿɿÕÀàÐÍ£©¡£
ÔÚÒ»·½Ã棬·þÎñ¶ËÓ¦¸Ã¸ºÔð±£Ö¤×ÔÉí״̬µÄÍêÕûÐÔ¡£Òò´ËËü²»ÄÜ¡¢Ò²²»Ó¦¸ÃÒÀÀµÓÚ¿Í»§¶ËËùÌṩµÄ°æ±¾ºÅ¡£²¢·¢¼ì²éÊÇ×÷Ϊһ¸öÌØÐÔÌṩ¸ø¿Í»§¶ËµÄ£¬¶ø²»ÊÇ·þÎñ¶ËÓÃÒÔ±£Ö¤Ä£ÐÍÍêÕûÐԵĻúÖÆ¡£Èç¹û¿Í»§¶Ë¹ØÐIJ¢·¢ÐÐΪ£¬ÄÇËü¾Í¿ÉÒÔÑ¡ÔñÐԵط¢ËͰ汾ºÅ£¬ÕâÒѾͨ¹ýÔÚETagÖеļÓÃÜÐÅÏ¢Ìṩ¸øËüÃÇÁË¡£Òª¼ÇסµÄÊÇ£¬²¢·¢¼ì²éÓë·þÎñ¶ËµÄʼþ°æ±¾ºÅÊDz»Í¬µÄ¸ÅÄºóÕßÊÇ·þÎñ¶ËµÄÄÚ²¿ÊµÏÖ»úÖÆ¡£
ÁíÒ»·½Ã棬¶ÔÓÚijЩ²Ù×÷À´Ëµ£¬²¢·¢¼ì²éÊÇûÓÐÒâÒåµÄ¡£¾ÙÀýÀ´Ëµ£¬Èç¹ûÁ½¸ö¿Í»§¶ËÔÚͬһʱ¼ä£¨µ÷ÓÃCheckInItemsToInventoryCommand·½·¨£©Ìí¼ÓÁË20¸ö¿â´æÎïÆ·£¬²¢ÇÒËüÃǶ¼¾ßÓа汾ºÅn£¬ÄÇôÆäÖÐÓÐÒ»¸öÃüÁî¾Í»áʧ°Ü£¬µ«ÕâÖÖʧ°ÜÊDz»±ØÒªµÄ£¬ÒòΪÎÒÃÇȷʵÐèÒªÌí¼Ó40¸öÎïÆ·¡£ÕâÖÖÎÊÌâÔڸ߷ÃÎÊÁ¿µÄÇé¿öÏ»ᱻ·Å´ó¡£ÏëÏóһϣ¬Èç¹û´óÁ¿µÄÓû§Ó¿ÈëÑÇÂíÑ·ÍøÕ¾È¥¹ºÂò¹þÀû²¨ÌصÄ×îÐÂÒ»ÆÚ£¬ÔÚ¶àÊýÇé¿öÏÂËûÃǶ¼»áÓöµ½²¢·¢ÎÊÌâ¡£
ÔÚHTTPÖÐÖ´ÐÐPUT£¨ºÍPATCH£©²Ù×÷ʱ»áÈÏΪ²¢·¢ÊÇÒ»¸ö¿ÉÑ¡µÄ¼ì²é£¬ÕâÒ»µã²¢·ÇżȻ¡£ËäÈ»²¢·¢¼ì²é¿ÉÒÔÒì²½Ö´ÐУ¬µ«ÎÒÃÇÐèÒª¾¡Á¦±£Ö¤Ëü±ØÐëͬ²½Ö´ÐУ¬Òò´Ëµ±ÎÒÃÇ·µ»Ø×´Ì¬Âë202£¨ÒѽÓÊÜ£©Ê±£¬¾Í´ú±í·þÎñ¶ËÒѾȷÈÏÁËûÓв¢·¢³åÍ»Çé¿öµÄ²úÉú¡£
ýÌåÀàÐ͵ÄÎåÖÖ¼¶±ð£¨5LMT£©ºÍ´´½¨ÐµÄýÌåÀàÐÍ
ÔÚÉçÇøÀï³£¼ûµÄÒ»ÖÖ×ö·¨ÊÇ´´½¨ÐµÄýÌåÀàÐÍ£¬Í¨³£³ÆÎª´òÔìеÄýÌåÀàÐÍ¡£¾ÙÀýÀ´Ëµ£º
Content-Type:application/vnd.InventoryItemListDataCollection.1.0.0.0+json;
ÕâÖÖʹÓ÷ÇÕý¹æµÄ·½Ê½±íʾij¸öýÌåÀàÐ͵Ä×ÓÀàÐÍÒѾ³ÉΪÁËÒ»ÖÖͨÓõÄʵ¼ù£¨ÒѾʵ¼ÊÉϳÉΪһÖÖÔ¼¶¨ÁË£©£¬Ëü½«×Óϵͳ·Ö½âÎªÒ»Ð©ÌØ¶¨µÄ¡¢»òÕßÊÇÕýʽµÄÔªËØ£¬²¢Í¨¹ý+ºÅÁ¬½ÓÔÚÒ»Æð¡£ÒѾÓÐЩ¾¹ý×¢²áµÄýÌåÀàÐÍʹÓÃÁËÕâÖÖÔ¼¶¨£¬ÀýÈçapplication/rss+xmlºÍapplication/atom+xml¡£ÕâÁ½¸öʾÀý´¦ÓÚýÌåÀàÐͼ¶±ðÖеĵÚ3¼¶±ð£¨»òÕß½Ð×öschema¼¶±ð£©£¬¶øapplication/xmlÔò´¦ÓÚµÚ2¼¶±ð£¨format¼¶±ð£©¡£Ä³ÖÖÒâÒåÉÏ˵£¬application/atom+xml¾ÍÊÇÒ»ÖÖapplication/xmlÀàÐÍ£¬ËüÃÇʹÓÃÏàͬµÄformat£¬¶øÇ°Õß»¹Ö¸Ã÷ÁË»áʹÓÃATOM
schema¡£
ËäÈ»ÕâÒ»Ô¼¶¨»áÔÚδÀ´°æ±¾µÄHTTP¹æ¸ñÖеõ½ÈϿɣ¬µ«Ëü²¢Î´½â¾öýÌåÀàÐͲ»¶ÏÔö³¤µÄÎÊÌâ¡£Ê×ÏÈ£¬Ê¹ÓÃÈκÎδע²áµÄýÌåÀàÐͶ¼ÊÇHTTP¹æ¸ñËù²»ÌᳫµÄ£¬Ê¹ÓÃÒÔÉÏÀàÐ͵ÄContent-TypeÖµÒ²ÊÇÒ»Ñù¡£Êµ¼ÊÉÏ£¬Èç¹ûÎÒÃÇÐèÒªÔÚËùÓÐAPIÖÐΪÎå¸ö²»Í¬Ã½Ìå¼¶±ðµÄÈÎÒâ×éºÏ¶¼×¢²áÒ»ÖÖýÌåÀàÐÍ£¬ÄÇ»¥ÁªÍøºÅÂë·ÖÅä¾Ö£¨IANA£©¿ÖÅÂÐèÒª·¢¶¯Ò»´óÅúÈËȥרÃÅ´ÓÊÂÕâ¸ö¹æÄ£¾Þ´óµÄÈÎÎñÁË¡£ÁíÒ»·½Ã棬Ðí¶à¿Í»§¶ËϵͳʹÓûùÓÚdictionaryµÄýÌåÀàÐÍÈ¥´¦ÀíÕâÖÖÇëÇó£¬ËüÃǽ«²»Äܹ»Ó¦¸¶Ð´´½¨µÄýÌåÀàÐÍ¡£
Òò´ËʹÓÃ5LMTÄܹ»ÔÊÐíÏÖÓеĿͻ§¶Ë¼ÌÐø°´ÕÕ֮ǰµÄ·½Ê½Õý³£¹¤×÷£¬¶ø¸üÏȽøµÄ¿Í»§¶ËÔò¿ÉÒÔÀûÓøü¸ß¼¶±ðµÄÐÅÏ¢£¬ËüÃǶ¼ÊÇ×÷Ϊ¶ÀÁ¢µÄʵÌåÌṩµÄ¡£
ͨ¹ýÒ»¸ö¹«¿ªµÄÁìÓò±£»¤ÄÚ²¿ÁìÓòÊǹؼüËùÔÚ
½«·þÎñ¶ËµÄÄÚ²¿ÊµÏÖ½øÐгéÏó¶Ô¿Í»§¶ËÀ´ËµÊǷdz£ÖØÒªµÄ¡£Èç֮ͬǰËùÊö£¬Îª½ÏСµÄÁìÓòËù´´½¨µÄ¹«¿ªÁìÓòºÍÄÚ²¿ÁìÓò»á±È½ÏÏàËÆ£¬µ«¼´Ê¹ÊÇÔÚm-rÕâ¸öʾÀýÖУ¬ÎÒÃÇÒ²²»Äܹ»½«ÄÚ²¿ÁìÓòÖ±½Ó±©Â¶³öÀ´£¬¶ø±ØÐë´´½¨Ò»¸ö¶ÀÁ¢µÄÄ£ÐÍ£¬Ëü±íÏÖÁ˿ͻ§¶ËÄܹ»½ÓÊպͽ»»¥µÄÐÅÏ¢¡£
ÎÒÃÇ»¹Ó¦¸Ã½«¹«¿ªÁìÓòÎĵµ»¯£¬²¢Õ¹ÏÖ¸ø¿Í»§¶Ë¡£ÕâÒ»·½ÃæµÄ½øÕ¹ÖµµÃ¹Ø×¢£¬ÒòΪÒѾÓи÷ÖÖ²»Í¬µÄ·½·¨ºÍʵ¼ù¿ªÊ¼Â¶³öË®ÃæÁË£¨´ÓWADLµ½Swagger¡¢RAMLºÍRestDownµÈµÈ£©¡£
½áÂÛ
²»½öͨ¹ýÒ»Ì×REST API±©Â¶CQRSÊÇ¿ÉÄܵ쬶øÇÒHTTPÓïÒåµÄ·á¸»ÐÔҲʹµÃÎÒÃÇÄܹ»ÔÚËüµÄ»ù´¡ÉϱàдһÌ×Á÷³©¶øÓÐЧµÄAPI¡£Õû¸öÁ÷³Ì°üÀ¨´´½¨Ò»¸öÓÉÃüÁîºÍ²éѯ£¨ÊäÈëÊä³öÏûÏ¢£©×é³ÉµÄ¹«¿ªÁìÓò£¬ÒÔ¼°Äܹ»´¦Àí²¢·¢ºÍ»º´æµÄ¸÷ÖÖ×ÊÔ´¡£´ËÍ⣬ÎÒÃÇ»¹ÐèÒª½«ÄÚ²¿ÁìÓòµÄ²éѯºÍÃüÁîÓ³ÉäΪHTTPν´Ê£¬²¢ÇÒʹÓÃ״̬ÂëÒÔ±íÏÖ״̬ת»»ºÍÒì³£¡£Ê¹ÓÃ5LMT½«ÓÐÖúÓÚ´´½¨ÍêÈ«RESTful£¬¶ø²»ÊÇÔ¶³Ì¹ý³Ìµ÷Ó÷ç¸ñµÄ×ÊÔ´¡£ËùÓÐÕâЩ¶¼¿ÉÒÔͨ¹ýÒ»¸öºÜСµ«¿ÉÒÔÔËÐеÄÔÐÍÓ¦ÓýøÐÐÕ¹ÏÖ£¬¸ÃÔÐÍÊÇͨ¹ýASP.NET
Web APIºÍAngularJSʵÏֵġ£
|