forked from mattmakai/fullstackpython.com
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathapi-creation.html
More file actions
336 lines (334 loc) · 18.8 KB
/
api-creation.html
File metadata and controls
336 lines (334 loc) · 18.8 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
<!DOCTYPE html>
<html lang="en"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="author" content="Matt Makai">
<link rel="shortcut icon" href="theme/img/fsp-fav.png">
<title>API Creation - Full Stack Python</title>
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
<script src="https://oss.maxcdn.com/libs/respond.js/1.3.0/respond.min.js"></script>
<![endif]-->
<style>
.toc-indent {padding-left: 25px;}
.toc-more-indent {padding-left: 37px;}
</style>
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-19910497-7', 'auto');
ga('send', 'pageview');
</script> </head>
<body>
<a href="https://github.com/makaimc/fullstackpython.github.com"><img style="position: absolute; top: 0; right: 0; border: 0;" src="https://camo.githubusercontent.com/a6677b08c955af8400f44c6298f40e7d19cc5b2d/68747470733a2f2f73332e616d617a6f6e6177732e636f6d2f6769746875622f726962626f6e732f666f726b6d655f72696768745f677261795f3664366436642e706e67" alt="Fork me on GitHub" data-canonical-src="https://s3.amazonaws.com/github/ribbons/forkme_right_gray_6d6d6d.png"></a>
<div class="container">
<div class="row">
<div class="col-md-12">
<div class="logo-header-section">
<a href="/" style="text-decoration: none; border: none;"><img src="theme/img/fsp-logo.png" height="52" width="52" class="logo-image" style="padding-top: 1px;" alt="Full Stack Python logo"></a>
<span class="logo-title"><a href="/">Full Stack Python</a></span>
</div>
</div>
</div><div class="row">
<div class="col-md-8">
<h1>API Creation</h1>
<p>Creating and exposing APIs allows your web application to interact with other
applications through machine-to-machine communication.</p>
<h2>API creation frameworks</h2>
<ul>
<li>
<p><a href="http://www.django-rest-framework.org/">Django REST framework</a> and
<a href="https://django-tastypie.readthedocs.org/en/latest/">Tastypie</a> are
the two most widely used API frameworks to use with Django. The edge
currently goes to Django REST framework based on rough community sentiment.
Django REST framework recently hit the
<a href="http://www.django-rest-framework.org/topics/3.0-announcement/">3.0 release mark</a>
after Tom Christie ran a
<a href="https://www.kickstarter.com/projects/tomchristie/django-rest-framework-3">successful Kickstarter campaign</a>.</p>
</li>
<li>
<p><a href="http://flask-restful.readthedocs.org/en/latest/">Flask-RESTful</a> and
<a href="http://flask.pocoo.org/docs/api/">Flask API</a> are popular libraries for
exposing APIs from Flask web applications.</p>
</li>
<li>
<p><a href="http://www.github.com/jeffknupp/sandman">Sandman</a> is a widely used tool to
automatically generate a RESTful API service from a legacy database without
writing a line of code (though it's easily extensible through code).</p>
</li>
<li>
<p><a href="https://cornice.readthedocs.org/en/latest/">Cornice</a> is a REST framework
for Pyramid.</p>
</li>
<li>
<p><a href="https://github.com/toastdriven/restless">Restless</a> is a lightweight API
framework that aims to be framework agnostic. The general concept is that
you can use the same API code for Django, Flask, Bottle, Pyramid or any
other WSGI framework with minimal porting effort.</p>
</li>
<li>
<p><a href="http://python-eve.org/">Eve</a> is a Python REST framework built with Flask,
MongoDB and Redis. The framework's primary author
<a href="https://twitter.com/nicolaiarocci">Nicola Iarocci</a> gave a great talk at
<a href="https://www.youtube.com/watch?v=9sUsLvG72_o">EuroPython 2014</a> that
introduced the main features of the framework.</p>
</li>
</ul>
<h2>API testing projects</h2>
<p>Building, running and maintaining APIs requires as much effort as building,
running and maintaining a web application. API testing frameworks are the
equivalent of browser testing in the web application world.</p>
<ul>
<li><a href="https://github.com/zatosource/zato-apitest">zato-apitest</a> invokes HTTP
APIs and provides hooks for running through other testing frameworks.</li>
</ul>
<h2>Hosted API testing services</h2>
<ul>
<li>
<p><a href="https://www.runscope.com/">Runscope</a> is an API testing SaaS application
that can test both your own APIs and external APIs that your application
relies upon.</p>
</li>
<li>
<p><a href="https://www.apiscience.com/">API Science</a> is focused on deep API testing,
including multi-step API calls and monitoring of external APIs.</p>
</li>
<li>
<p><a href="http://smartbear.com/api-testing/">SmartBear</a> has several API monitoring
and testing tools for APIs.</p>
</li>
</ul>
<h2>API creation resources</h2>
<ul>
<li>
<p><a href="http://pydanny.com/choosing-an-api-framework-for-django.html">Choosing an API framework for Django</a>
by <a href="https://twitter.com/pydanny">PyDanny</a> contains questions and insight
into what makes a good API framework and which one you should currently
choose for Django.</p>
</li>
<li>
<p><a href="http://www.slideshare.net/Solution4Future/python-restful-webservices-with-python-flask-and-django-solutions">RESTful web services with Python</a>
is an interesting overview of the Python API frameworks space.</p>
</li>
<li>
<p><a href="http://www.slideshare.net/jmusser/ten-reasons-developershateyourapi">10 Reasons Why Developers Hate Your API (And what to do about it)</a>
goes through the top difficulties and annoyances developers face when
working with APIs and how you can avoid your API falling into the same
traps.</p>
</li>
<li>
<p>Versioning of RESTful APIs is a difficult and contentious topic in the
web API community. This two-part series covers
<a href="http://urthen.github.io/2013/05/09/ways-to-version-your-api/">various ways to version your API</a>
and <a href="http://urthen.github.io/2013/05/16/ways-to-version-your-api-part-2/">how to architect a version-less API</a>.</p>
</li>
<li>
<p><a href="http://www.narwhl.com/">NARWHL</a> is a practical API design site for
developers confused about what is appropriate for RESTful APIs.</p>
</li>
<li>
<p><a href="http://blog.luisrei.com/articles/flaskrest.html">Implementing a RESTful Web API with Python & Flask</a>
is a straightforward introduction to using Flask to create request
handling and responses to produce a web API.</p>
</li>
<li>
<p>This <a href="https://github.com/interagent/http-api-design">API Design Guide</a>
is based on Heroku's best practices for the platform's API.</p>
</li>
<li>
<p><a href="https://18f.gsa.gov/">18F</a>'s
<a href="https://github.com/18f/api-standards">API standards</a> explains the details
behind their design decisions on creating modern RESTful APIs.</p>
</li>
<li>
<p><a href="https://medium.com/@zwacky/design-a-beautiful-rest-api-901c73489458">Design a beautiful REST API</a>
reviews common design decisions regarding endpoints, versioning, errors and
pagination. There is also a
<a href="https://www.youtube.com/watch?v=5WXYw4J4QOU">source material YouTube video</a>
where this blog post derives its recommendations from.</p>
</li>
<li>
<p><a href="http://amberonrails.com/move-fast-dont-break-your-api/">Move Fast, Don't Break Your API</a>
are slides and a detailed blog post from Amber Feng at Stripe about
building an API, separating layers of responsibility, hiding backwards
compatibility and a whole slew of other great advice for developers
and API designers.</p>
</li>
<li>
<p><a href="http://www.bizcoder.com/self-descriptive-isn-t-don-t-assume-anything">Self-descriptive, isn't. Don't assume anything.</a>
is an appeal that metadata makes a difference in whether APIs are descriptive
or not.</p>
</li>
<li>
<p><a href="http://artsy.github.io/blog/2014/09/12/designing-the-public-artsy-api/">Designing the Artsy API</a>
has their recommendations list for building an API based on their recent
experiences.</p>
</li>
<li>
<p><a href="https://bourgeois.me/rest/">Some REST Best Practices</a> is a high level
summary of rules to follow while creating your API.</p>
</li>
<li>
<p>Hacker News had a discussion on
<a href="https://news.ycombinator.com/item?id=8912897">what's the best way to write an API spec?</a>
that provides a few different viewpoints on this topic.</p>
</li>
<li>
<p><a href="https://pages.apigee.com/rs/apigee/images/api-design-ebook-2012-03.pdf">Apigee's Web API Design ebook</a>
is free and contains a wealth of practical advice for what design
decisions to make for your web API.</p>
</li>
</ul>
<h2>API creation learning checklist</h2>
<p><i class="fa fa-check-square-o"></i>
Pick an API framework appropriate for your web framework. For Django I
recommend Django REST framework and for Flask I recommend Flask-RESTful.</p>
<p><i class="fa fa-check-square-o"></i>
Begin by building out a simple use case for the API. Generally the use case
will either involve data that users want in a machine-readable format or a
backend for alternative clients such as an iOS or Android mobile app.</p>
<p><i class="fa fa-check-square-o"></i>
Add an authentication mechanism through OAuth or a token scheme.</p>
<p><i class="fa fa-check-square-o"></i>
Add rate limiting to the API if data usage volume could be a performance issue.
Also add basic metrics so you can determine how often the API is being
accessed and whether it is performing properly.</p>
<p><i class="fa fa-check-square-o"></i>
Provide ample documentation and a walkthrough for how the API can be accessed
and used.</p>
<p><i class="fa fa-check-square-o"></i>
Figure out other use cases and expand based on what you learned with the
initial API use case.</p>
<h3>What's next after building an API for your web app?</h3>
<div class="row">
<div class="col-md-3">
<div class="well select-next">
<a href="/application-programming-interfaces.html" class="btn btn-success btn-full"><i class="fa fa-exchange fa-2x"></i></a>
<p class="under-btn">
What are application programming interfaces?
</p>
</div>
</div>
<div class="col-md-3">
<div class="well select-next">
<a href="/api-integration.html" class="btn btn-success btn-full"><i class="fa fa-link fa-2x"></i></a>
</a>
<p class="under-btn">
How do I integrate external APIs into my application?
</p>
</div>
</div>
<div class="col-md-3">
<div class="well select-next">
<a href="/web-application-security.html" class="btn btn-success btn-full"><i class="fa fa-lock fa-inverse fa-2x"></i></a>
<p class="under-btn">
How can I learn about web application security?
</p>
</div>
</div>
<div class="col-md-3">
<div class="well select-next">
<a href="/static-content.html" class="btn btn-success btn-full"><i class="fa fa-spinner fa-inverse fa-2x"></i></a>
<p class="under-btn">
Where should I host static content such as JavaScript files?
</p>
</div>
</div>
</div> <div id="mc_embed_signup">
<form action="//mattmakai.us2.list-manage.com/subscribe/post?u=b7e774f0c4f05dcebbfee183d&id=b22335388d" method="post" id="mc-embedded-subscribe-form" name="mc-embedded-subscribe-form" class="validate" target="_blank" novalidate>
<div id="mc_embed_signup_scroll">
<h4>Interested in major updates to this site or an alert when a complete Full Stack Python book with detailed example code is released? Sign up here and you'll an occasional email only when there's big news to report.</h4>
<div class="row">
<div class="col-md-9">
<input type="email" value="" name="EMAIL" class="email form-control" id="mce-EMAIL" placeholder="email address" required>
<div style="position: absolute; left: -5000px;"><input type="text" name="b_b7e774f0c4f05dcebbfee183d_b22335388d" tabindex="-1" value=""></div>
</div>
<div class="col-md-3">
<div class="clear"><input type="submit" value="Subscribe" name="subscribe" id="mc-embedded-subscribe" class="btn btn-success" style="font-family: 'Helvetica Neue';"></div>
</div>
</div>
</div>
</form>
</div>
</div>
<div class="col-md-offset-1 col-md-3" id="sidebar">
<div class="panel panel-success">
<div class="panel-heading">
<h3 class="panel-head"><a href="/table-of-contents.html" style="color: #fff;">Table of Contents</a></h3>
</div>
<div class="list-group">
<a href="/introduction.html" class="list-group-item smaller-item ">Introduction</a>
<a href="/why-use-python.html" class="list-group-item smaller-item ">Why Use Python?</a>
<a href="/development-environments.html" class="list-group-item smaller-item ">Development Environments</a>
<a href="/vim.html" class="list-group-item smaller-item ">Vim</a>
<a href="/best-python-resources.html" class="list-group-item smaller-item ">Best Python Resources</a>
<a href="/web-frameworks.html" class="list-group-item smaller-item ">Web Frameworks</a>
<a href="/django.html" class="list-group-item smaller-item ">Django</a>
<a href="/flask.html" class="list-group-item smaller-item ">Flask</a>
<a href="/bottle.html" class="list-group-item smaller-item ">Bottle</a>
<a href="/pyramid.html" class="list-group-item smaller-item ">Pyramid</a>
<a href="/morepath.html" class="list-group-item smaller-item ">Morepath</a>
<a href="/other-web-frameworks.html" class="list-group-item smaller-item ">Other Web Frameworks</a>
<a href="/web-design.html" class="list-group-item smaller-item ">Web Design</a>
<a href="/cascading-style-sheets.html" class="list-group-item smaller-item ">Cascading Style Sheets</a>
<a href="/javascript.html" class="list-group-item smaller-item ">JavaScript</a>
<a href="/websockets.html" class="list-group-item smaller-item ">WebSockets</a>
<a href="/web-application-security.html" class="list-group-item smaller-item ">Web Application Security</a>
<a href="/databases.html" class="list-group-item smaller-item ">Databases</a>
<a href="/no-sql-datastore.html" class="list-group-item smaller-item ">NoSQL Data Stores</a>
<a href="/application-programming-interfaces.html" class="list-group-item smaller-item ">Application Programming Interfaces</a>
<a href="/api-integration.html" class="list-group-item smaller-item ">API Integration</a>
<a href="/api-creation.html" class="list-group-item smaller-item active">API Creation</a>
<a href="/deployment.html" class="list-group-item smaller-item ">Deployment</a>
<a href="/servers.html" class="list-group-item smaller-item ">Servers</a>
<a href="/platform-as-a-service.html" class="list-group-item smaller-item ">Platform-as-a-service</a>
<a href="/operating-systems.html" class="list-group-item smaller-item ">Operating Systems</a>
<a href="/web-servers.html" class="list-group-item smaller-item ">Web Servers</a>
<a href="/wsgi-servers.html" class="list-group-item smaller-item ">WSGI Servers</a>
<a href="/source-control.html" class="list-group-item smaller-item ">Source Control</a>
<a href="/application-dependencies.html" class="list-group-item smaller-item ">Application Dependencies</a>
<a href="/static-content.html" class="list-group-item smaller-item ">Static Content</a>
<a href="/task-queues.html" class="list-group-item smaller-item ">Task Queues</a>
<a href="/configuration-management.html" class="list-group-item smaller-item ">Configuration Management</a>
<a href="/continuous-integration.html" class="list-group-item smaller-item ">Continuous Integration</a>
<a href="/logging.html" class="list-group-item smaller-item ">Logging</a>
<a href="/monitoring.html" class="list-group-item smaller-item ">Monitoring</a>
<a href="/web-analytics.html" class="list-group-item smaller-item ">Web Analytics</a>
<a href="/docker.html" class="list-group-item smaller-item ">Docker</a>
<a href="/caching.html" class="list-group-item smaller-item ">Caching</a>
<a href="/code-metrics.html" class="list-group-item smaller-item ">Code Metrics</a>
<a href="/what-full-stack-means.html" class="list-group-item smaller-item ">What "Full Stack" Means</a>
<a href="/change-log.html" class="list-group-item smaller-item ">Change Log</a>
<a href="/future-directions.html" class="list-group-item smaller-item ">Future Directions</a>
<a href="/about-author.html" class="list-group-item smaller-item ">About the Author</a>
</div>
</div>
<div class="panel panel-success">
<div class="panel-heading"><h3 class="panel-head">API Creation</h3></div>
<div class="panel-body">
Need more detailed tutorials and walkthroughs than you see here?
<a href="/email.html">Sign up for an email alert when that content is created.</a>
<hr/>
<a href="/">Full Stack Python</a> is an open book that explains
concepts in plain language and provides the most helpful resources
on those topics.
<hr/>
<a href="http://twitter.com/mattmakai">Matt Makai</a> built
this site with appreciated assistance from
<a href="https://github.com/makaimc/fullstackpython.github.com/pulls">pull requests</a>.
</div>
</div>
</div></div>
<hr/>
<div class="footer pull-right">
<a href="http://www.mattmakai.com/" class="underline">Matt Makai</a>
2015
</div>
</div>
<link href="theme/css/f.min.css" rel="stylesheet">
<link href="//netdna.bootstrapcdn.com/font-awesome/4.1.0/css/font-awesome.css" rel="stylesheet">
</body>
</html>