0
点赞
收藏
分享

微信扫一扫

请求分析request


  

  全栈工程师开发手册 (作者:栾鹏)

  架构系列文章

  这节中,我们来根据客户请求报文中的请求行(Request line) ,请求头部(Request Header),请求主体(Request body)的信息,来描述服务端如何处理。

  请求行的格式:

  tornado.web库

  再次重申:tornado 用 web.RequestHandler 类,来处理客户请求。每一次客户发来请求,先由服务器应用APP根据路由映射,调用处理类,生成一个RequestHandler类对象。这个类对象负责处理 客户请求的请求信息,并根据类的处理方法,生成返回的响应报文。

  我们这里,根据客户的请求报文三个部分,来看看 客户的请求报文 提供的信息。

  处理请求方法Method–Request Line

  客户的请求方式在HTTP/1.1中,有八种之多。在生产环境中常用到的是get和post两种方法。

  get方法,主要用来请求数据。client端将请求的信息以URL编码的信息明文传递给服务器。

  post方法,主要用来传递数据给服务端。client端请求的信息以数据包形式传送给服务端。

  post请求,常用来提交表单的私密数据。get请求,网页中文件加载等。

  同一个Request-URL,可使用多个请求方法。表示 将概念相关的处理方法绑定在同一个URL中。

  比如用户信息,用get表示请求用户信息,用post表示修改用户的信息等。

  再如:Request-URL 为 ,即可利用get 方法通过 book_id 得到书籍的详细信息。也可利用post方法,提交书籍的信息,从而修改书籍有详细信息。

  实现过程:(这里测试同一个URL绑定多个请求方法)

  URL的秘密

  URL书写风格

  URL有两种表示风格。早期,查询字符串风格,在URL中以?表示传递的参数 ,比如在百度中搜索,URL的请求地址: 。

  后期,出现RESTFUL风格的表示方式(Representational State Transfe). 这种概念中,每一个URL 都表示一种资源,而将对资源的操作放在了请求体中。简单说来,也是一种HTTP的分层思想,将资源和操作分离开。

  查询字符串风格 :

  RESTFUL风格 :

  通过参数使用方法,通过路径调用方法

  自定义参数 --URL和Request body

  在客户端的请求报文中,网站开发者的自定义参数,出现在两个地方:URL的查询字符串中,和请求报文的请求体(Request body)中。

  get_argument 获取URL查询字符串或请求体中的参数信息。而get_arguments 获取查询字符串或请求体中的信息对应元素列表。命令使用方法: ,注意返回的信息是unicode字符串。

  get_query_argument ,get_query_arguments。只查询URL字符串信息。

  get_body_argument, get_body_arguments 查询请求主体中信息。

  URL路由匹配问题

  第三节中,我们简单的说明了路由正则匹配的事情。这里我们需要注意几点:

  链接路由请求,在路由匹配时,只要匹配到。就不再向后匹配。

  如果使用正则分组,请求方法的参数要分组名保持个数相同。如果分组没命名,则按顺序传入参数。

  服务中处理 请求时,分组 做为参数 传递。对参数进行操作。(倒序)

  请求头部的元素–Request header

  每一次客户请求报文中请求头部包含的客户端信息,我们都封装在这次请求生成的RequestHandler对象的request属性中。比如说请求头部包含的客户地址表示:。

  下面列出一些比较请求信息:

  get_argument(name,default=_ARG_DEFAULT,strip=True)

  get_arguments(name,strip=True)

  get_body_argument(name,default=_ARG_DEFAULT,strip=True)

  get_body_arguments(name,strip=True)

  get_query_argument(name,default=_ARG_DEFAULT,strip=True)

  get_query_arguments(name,strip=True):

  一 RequestHandler.get_argument()和RequestHandler.get_arguments():

  实际上是通过RequestHandler._get_argument()和RequestHandler._get_arguments()对HTTPServerRequest.arguments进行一些去空格,编码,默认值等操作。HTTPServerRequest.arguments包括GET和POST请求的所有参数。

  get_argument()实际上是获取的get_arguments()[-1]。

  class HTTPServerRequest(object):

  attribute:arguments

  GET/POST arguments are available in the arguments property, which

  maps arguments names to lists of values (to support multiple values

  for individual names). Names are of type , while arguments

  are byte strings. Note that this is different from

  , which returns argument values as

  unicode strings.

  二 RequestHandler.get_query_argument()和RequestHandler.get_query_arguments():

  实际上是通过RequestHandler._get_argument()和RequestHandler._get_arguments()对HTTPServerRequest.query_arguments进行一些去空格,编码,默认值等操作。HTTPServerRequest.query_arguments只包括请求的url上所带的参数。

  class HTTPServerRequest(object):

  attribute: query_arguments

  Same format as , but contains only arguments extracted

  from the query string.

  二 RequestHandler.get_body_argument()和RequestHandler.get_body_arguments():

  HTTPServerRequest.body_arguments只包括请求body里所带的参数。

  class HTTPServerRequest(object):

  attribute: body_arguments

  Same format as , but contains only arguments extracted

  from the request body.

  获取url后的参数

  url=‘127.0.0.1:8080/test?search_title=测试标题1&search_title=测试标题2&search_name=测试名称&test_body=测试’

  若存在多个重复的参数名,利用get_argument(),get_query_argument只能获取最后一个,即’测试标题2’。利用get_arguments(),get_query_arguments()能获得一个unicode编码的list,得到所有相同参数名的参数。

  get_body_argument(),get_body_arguments()不能获取url中的参数。

  search_title=self.get_argument(‘search_title’,’’) # 测试标题2

  search_titles=self.get_arguments(‘search_title’, []) # unicode编码的list, 实际为[测试标题1,测试标题2]

  search_name=self.get_query_argument(‘search_name’,’’) # 测试名称

  search_names=self.get_query_arguments(‘search_name’,[]) # unicode编码的list, 实际为[测试名称]

  test_body_argument=self.get_body_argument(‘test_body’,’’) # ‘’

  form表单序列化后的数据。

  表单中多个同名,利用get_arguments()和get_body_arguments()获取list。

  flow_title=self.get_argument(‘flow_title’,’’) # 测试流程

  test_flow_title=self.get_body_argument(‘flow_title’,’’) # 测试流程

  step_titles=self.get_arguments(‘step_title’,[]) # list

  tesst_step_titles=self.get_body_arguments(‘step_title’,[]) # list

  js相关

  var data={‘test_arg’, ‘v1’} // 同个’test_arg’获取

  var list_data={‘test_arg’, [‘v1’, ‘v2’]} // 通过’test_list[]'获取

  test_arg=self.get_argument(‘test_arg’, ‘’)

  test_args=self.get_arguments(‘test_arg[]’, ‘’) # 获取到list

  tornado/web.py

  tornado/httputil.py

  tornado/escape.py

举报

相关推荐

0 条评论