现在我有两种方法在我的应用程序中完成(显然)同样的事情。我可以将我的网址设为https://something/product/shirt或https://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)
我的问题是,这些方法是否相同?如果我做其中一个或者我必须考虑其他因素,它是一样的吗?
答案 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
,其中fmt
和size
都是可选的,有一些默认值,可以选择以任何顺序出现,只有通过查询才能轻松实现这一点,这对于URL来说是令人讨厌/复杂的。
但是"查询语法"使用单个强制参数是一种(中等)" API设计气味" - 而且不只是在App Engine中;虽然App Engine有自己的路由和调度机制,但它们并不特别与您对其他服务器的期望不一致。
答案 1 :(得分:0)
查看您希望做出的所有请求,并确定哪些请求应由唯一端点(/shirt
)表示,哪些将允许一个或多个参数。您可以在必要时组合这些方法。
使用url路径或参数没有性能损失或任何其他优势。关键因素是:
例如,/shirt
现在可能看起来不错,但是一旦您拥有数千种产品类型,它就成了维护的噩梦。相反,您可能想要使用类似的东西:
/product/?type=shirt&size=10&orderBy=price&results=20&offset=40