是等同于将某些东西作为路径的一部分并作为参数?

时间:2015-11-22 18:58:34

标签: google-app-engine url webapp2

现在我有两种方法在我的应用程序中完成(显然)同样的事情。我可以将我的网址设为https://something/product/shirthttps://something/product?q=shirt。在这两种情况下,我都可以从中提取我需要的东西,这是衬衫。

第一种方式(使用正则表达式):

class FirstHandler(BaseHandler):
    def get(self, page_id):
        target = page_id

PAGE_RE = r'(/(?:[a-zA-Z0-9_-]+/?)*)'
app = webapp2.WSGIApplication([('/something' + PAGE_RE, FirstHandler)],
                               debug=True)

我可以处理它的第二种方法是使用一个参数,如下所示:

class SecondHandler(BaseHandler):
    def get(self):
        target = self.request.get('q')

app = webapp2.WSGIApplication([('/something' SecondHandler)],
                               debug=True)

我的问题是,这些方法是否相同?如果我做其中一个或者我必须考虑其他因素,它是一样的吗?

2 个答案:

答案 0 :(得分:0)

app.yaml可以为您预先路由(到不同的WSGI应用 - 甚至是dispatch.yaml的帮助)到不同的模块),基于URL,但基于对给定网址的特定查询。

因此,如果您将资源标识为/something/product/shirt,那么将来可能"在行政上" (通过更改app.yaml和可能dispatch.yaml配置文件,而不是Python代码)将某些产品预先路由到不同的WSGI应用程序甚至模块;如果您将其标识为/something/product?q=shirt,则基于管理配置文件的路由将仅基于/something/product的单个WSGI应用程序,然后将由服务该应用程序的代码来处理w /查询部分。

因此,在其他条件相同的情况下,您可能更愿意使用URL来为将来保留更多的路由灵活性。查询部分对于可选参数和顺序独立性等内容非常宝贵 - 例如/something/product/shirt?fmt=json&size=xl,其中fmtsize都是可选的,有一些默认值,可以选择以任何顺序出现,只有通过查询才能轻松实现这一点,这对于URL来说是令人讨厌/复杂的。

但是"查询语法"使用单个强制参数是一种(中等)" API设计气味" - 而且不只是在App Engine中;虽然App Engine有自己的路由和调度机制,但它们并不特别与您对其他服务器的期望不一致。

答案 1 :(得分:0)

查看您希望做出的所有请求,并确定哪些请求应由唯一端点(/shirt)表示,哪些将允许一个或多个参数。您可以在必要时组合这些方法。

使用url路径或参数没有性能损失或任何其他优势。关键因素是:

  • 了解您的API是否容易,如果外部开发人员正在或将要使用它
  • 组织和维护代码的难易程度
  • 当您需要扩展它时,您的方法有多灵活

例如,/shirt现在可能看起来不错,但是一旦您拥有数千种产品类型,它就成了维护的噩梦。相反,您可能想要使用类似的东西:

/product/?type=shirt&size=10&orderBy=price&results=20&offset=40