关注微信公众号(瓠悠笑软件部落),一起学习,一起摸鱼
现在,Web应用程序暴露某种数据模型或计算功能并不罕见。 没有深入细节,一个策略是遵循Roy T. Fielding所描述的REST原则。
粗略地说,它假定您可以识别资源,并且您可以通过该标识符来寻址该资源。
“你能干什么?” 嗯,大多数情况下,这些原则可以确保您尽可能地将应用程序公开的实体与它们被操纵或使用的方式分离。 为了接受这种观点,开发人员通常会设计一个Web API来公开(URL,HTTP方法,数据,约束)对。
注意:
您经常会一起听到REST和Web API。 前者是提供后者的一种策略。 本教程不会更深入地介绍整个Web API概念,因为它是一个更具吸引力的主题,但您应该在线阅读更多相关内容。
让我们按照REST原则温和地浏览一个非常基本的Web API的小例子。
import random
import string
import cherrypy
@cherrypy.expose
class StringGeneratorWebService(object):
@cherrypy.tools.accept(media='text/plain')
def GET(self):
return cherrypy.session['mystring']
def POST(self, length=8):
some_string = ''.join(random.sample(string.hexdigits, int(length)))
cherrypy.session['mystring'] = some_string
return some_string
def PUT(self, another_string):
cherrypy.session['mystring'] = another_string
def DELETE(self):
cherrypy.session.pop('mystring', None)
if __name__ == '__main__':
conf = {
'/': {
'request.dispatch': cherrypy.dispatch.MethodDispatcher(),
'tools.sessions.on': True,
'tools.response_headers.on': True,
'tools.response_headers.headers': [('Content-Type', 'text/plain')],
}
}
cherrypy.quickstart(StringGeneratorWebService(), '/', conf)
将其保存到名为tut07.py的文件中,并按如下方式运行:
$ python tut07.py
在我们看到它的实际应用之前,让我们解释一些事情。 到目前为止,CherryPy正在创建一个用于匹配URL的公开方法树。 对于我们的Web API,我们想强调实际请求的HTTP方法所起的作用。 因此,我们创建了以它们命名的方法,并且通过使用cherrypy.expose修饰类本身,它们全部暴露出来。
但是,我们必须从匹配URL的默认机制切换到知道整个HTTP方法shenanigan的方法。 这就是我们创建MethodDispatcher实例的第27行。
然后我们强制将响应内容类型设置为text / plain,并最终确保仅通过在请求中设置Accept:text / plain标头来响应接受该内容类型的客户端。 但是,我们仅对该HTTP方法执行此操作,因为它对其他方法没有太大意义。
出于本教程的目的,我们将使用Python客户端而不是您的浏览器,否则我们将无法实际尝试我们的Web API。
请通过以下命令安装 requests:
$ pip install requests
然后启动Python终端并尝试以下命令:
>>> import requests
>>> s = requests.Session()
>>> r = s.get('http://127.0.0.1:8080/')
>>> r.status_code
500
>>> r = s.post('http://127.0.0.1:8080/')
>>> r.status_code, r.text
(200, u'04A92138')
>>> r = s.get('http://127.0.0.1:8080/')
>>> r.status_code, r.text
(200, u'04A92138')
>>> r = s.get('http://127.0.0.1:8080/', headers={'Accept': 'application/json'})
>>> r.status_code
406
>>> r = s.put('http://127.0.0.1:8080/', params={'another_string': 'hello'})
>>> r = s.get('http://127.0.0.1:8080/')
>>> r.status_code, r.text
(200, u'hello')
>>> r = s.delete('http://127.0.0.1:8080/')
>>> r = s.get('http://127.0.0.1:8080/')
>>> r.status_code
500
第一个和最后一个 500 responses 源于这样的事实:在第一种情况下,我们尚未通过POST生成字符串,而在后一种情况下,我们删除它后它不存在。
第12-14行显示了当客户端将生成的字符串作为JSON格式请求时应用程序如何反应。 由于我们将Web API配置为仅支持纯文本,因此它返回相应的HTTP错误代码。
注意
我们使用请求的Session接口,以便在每个后续请求中承载存储在请求cookie中的会话ID。 这很方便。
重要
这些都是关于RESTful URL的,不是吗?
您的网址很可能是由您无法与网页处理程序匹配的动态部分组成的。 例如,/ library / 12 / book / 15不能由默认的CherryPy调度程序直接处理,因为 12 和 15 将不匹配任何Python 可调用方法。
这可以通过高级部分中介绍的两个方便的CherryPy功能轻松解决。