silicon valley 2014 - api antipatterns

92
API An&pa)erns …iden&fying, and avoiding them Silicon Valley Code Camp 2014 #svcc

Upload: manish-pandit

Post on 19-Jun-2015

441 views

Category:

Technology


2 download

DESCRIPTION

My talk at Silicon Valley Code Camp 2014 on API Antipatterns.

TRANSCRIPT

  • 1. APIAn&pa)ernsiden&fying,andavoidingthemSiliconValleyCodeCamp2014#svcc

2. [email protected]/in/mpanditslideshare.net/lobster1234@lobster1234 3. APIsAmeansforsoLwaretointeractwithothersoLware.@lobster1234 4. @lobster1234 5. @lobster1234ImageCredit:h)p://en.wikipedia.org/wiki/Internet_of_Things 6. @lobster1234 7. RESTAPIRESTisnotastandard,butanarchitecture@lobster1234 8. RESTAPIRESTisnotastandard,butanarchitecture,whichprefersusingHTTPasamodelforallinterac0ons.HTTPisastandard,RESTisaconven&on.@lobster1234 9. REST!=HTTPREST!=SOAP@lobster1234 10. @lobster1234 11. RESTAPINounResource,ortheEn&tyVerbAc&on+Iden0fier@lobster1234 12. Image:h)p://www.educa&on.com/study-help/ar&cle/nouns/@lobster1234 13. ProtocolMayormaynotbestandard@lobster1234 14. ProtocolMayormaynotbestandardIndicatesanagreementbetweenthepar&es@lobster1234 15. @lobster1234 16. PayloadFormat(XML,JSON,CustomText,Binary..)Transport(HTTP,Binaryoversockets,FTP..)@lobster1234 17. @lobster1234 18. h)p://www.neGlix.com/header/neGlix_logo.gifOr,reques0ngaresourcefromtheserverbygivingitspathusingaprotocol.@lobster1234 19. Everyrequestdeservesaresponse.@lobster1234 20. Headersdescribetheresponse@lobster1234 21. HeadersdescribetheresponseStatusCodeindicatesthesuccess/failure@lobster1234 22. HeadersdescribetheresponseStatusCodeindicatesthesuccess/failureBodycontainstheactualpayload@lobster1234 23. Telltheserverwhattodoviaac0ons@lobster1234 24. Ac&onsareHTTPmethods,whichmapnicelyto(mostof)thebusinessinterac&ons@lobster1234 25. CreatePOSTReadGETUpdatePUT(orPATCH)Delete-DELETEHEAD,OPTIONS,TRACE,CONNECT@lobster1234 26. Pa)erns@lobster1234 27. Pa)ernsPa)ernsarere-usablesolu&onstocommonlyoccurringproblems.@lobster1234 28. An&pa)ernsAn&pa)ernsarere-usablesolu&onstocommonlyoccurringproblems,thatlookgreatonthesurface,butreallyarent.@lobster1234 29. APIAn&pa)ernsRequestMethodResponseOrganiza&onal@lobster1234 30. RequestAn&pa)erns@lobster1234 31. Over-usingQueryStrings@lobster1234 32. /pets?name=scruffyvs./pets/name/scruffy@lobster1234 33. /pets?name=scruffy&zip=94568vs./pets/name/scruffy/loca&on/zip/94568@lobster1234 34. Avoidquerystringsforresourceiden&fica&onButusethemforrequestmetadata**Exceptforsearch@lobster1234 35. Pagina&onFilteringSor&ng..@lobster1234 36. @lobster1234 37. QueryStringsh)p://some.api.com/movies?start=0&count=10&sortBy=name&fields=name,cast,releaseDate@lobster1234 38. AllowingclientstoscrapethedataviayourAPIs@lobster1234 39. @lobster1234 40. Thinkbatchjobsreques&ngthecatalognightly!@lobster1234 41. Requestmetadatatotherescue?@lobster1234 42. .howabouta?since=1dor?since=UTC@lobster1234 43. MethodAn&pa)erns@lobster1234 44. UsingQueryStringstooverloadmethods@lobster1234 45. /pets?perform=update&name=scruffy&id=24@lobster1234 46. UsetheappropriateHTTPMethodtorepresentyourac&on@lobster1234 47. UsingPOSTforallwrites@lobster1234 48. GETtoretrieve,orsearchPOSTtocreate,orupsertPUTtoupdate(orbe)eryet,PATCH)DELETEtodelete@lobster1234 49. ResponseAn&pa)erns@lobster1234 50. AlwaysreturningHTTP200@lobster1234 51. @lobster1234 52. HTTP200OK{success:false}@lobster1234 53. HTTP200OK{error:Personjdoenotfound}@lobster1234 54. 2xxforsuccess3xxforredirects/caching4xxforrequest/clienterrors5xxforservererrors@lobster1234 55. SomeUseful(andnotsocommon)CodesReturnaLeradelete-204Faileddatabaseconstraint-409Methodnotsupported-405Tryingtoaskfortoomuchdata-413Valida&onFailure-418@lobster1234 56. Alwaysreturninga401forauthfailures 57. @lobster1234 58. AuthUseHTTP401Unauthorizedtoindicatethattheclientneedstoauthen&cate@lobster1234 59. AuthUseHTTP403Forbiddentoindicatethattheclientscreden&alsdonotallowaccesstotherequestedresource@lobster1234 60. 401vs403401=Comebackwithakey403=Yourkeydoesnotworkforthislock.@lobster1234 61. Processingrequestssynchronously,even&meintensiveones@lobster1234 62. Asynctheopera&on,andreturnHTTP202Accepted@lobster1234 63. @lobster1234 64. Asyncopera&onsresponseshouldhelpthecaller.{statusUrl:}@lobster1234 65. Organiza&onalAn&pa)erns@lobster1234 66. Notdifferen&a&ngbetweenen00esandinstances@lobster1234 67. /pets?type=dog&name=bigvs/pets/dogs/name/big@lobster1234 68. Namespaceyourresourcesinacollec&onUsepathsandiden&fierstotraverse@lobster1234 69. Usingidintheresourceiden&fica&onpath@lobster1234 70. /pets/id/1234vs/pets/1234@lobster1234 71. Useallothera)ributesinthepath,excepttheid.idisimplied@lobster1234 72. @lobster1234Resourcesinanisland 73. @lobster1234 74. Everyen&tyoraresourceis&edtoothers.@lobster1234 75. Everyen&tyoraresourceis&edtoothers.Andyourestuckguessingtheconnec&ons!@lobster1234 76. @lobster1234WelljustreturntheIDs! 77. HATEOAS(orsomethingsimilar)@lobster1234 78. Readcodetofigureouttheresourcesanda)ributes.@lobster1234 79. @lobster1234 80. UseMetapagesforresourcedescrip&on/resource/meta/collec&on/meta@lobster1234 81. APIsarenotdiscoverable@lobster1234 82. Consideradocumenta&ongeneratorlikeSwagger,IODocs@lobster1234 83. Relyingoncookiesforauthen&ca&on@lobster1234 84. @lobster1234 85. Acceptcookiesasafallback,butpreferaqueryparameterorHTTPrequestheader.@lobster1234 86. Storingstateontheservernodes@lobster1234 87. Stateless==Simple@lobster1234 88. Requestseithermodifythestateofaresource,orreadit.Allrequeststotheclusterseethesamestateoftheresource@lobster1234 89. Avoidstateasmuchaspossible.Maintainthestateinthedatabase.Ifyouneedtostoretransientstateontheserver,itsacode(orarchitecture)smell.@lobster1234 90. VersioningUsing301storedirect/re&reAPIsCachingUsingHTTPheaderscorrectlyCachingresponsebodies@lobster1234 91. @lobster1234Fin