5

我有一个 url,我需要添加一个 api 密钥作为参数。密钥中有 % 和其他字符,不应该是 url 编码,有没有办法用furl做到这一点?

这是我当前的代码:

request_url = furl('http://www.domain.com/service/') \
    .add({
    'format'     : 'json',
    'location'      : address_line_1 + ',' + city + ',' + state,
    'key'           : APP_KEY
}).url
4

1 回答 1

1

我有一个 url,我需要添加一个 api 密钥作为参数。密钥中包含 % 和其他字符,不应进行 url 编码

那不可能是真的。它必须是 URL 编码的。否则,您最终会得到一个无效的 URL,或者一个不代表您想要的 URL。

例如,假设键是123%456%789. 如果您发送http://www.domain.com/service/?format=json&key=123%25456%25789,则另一端的Web服务将获得123%456%789,这将成功。如果你只是 send http://www.domain.com/service/?format=json&key=123%456%789,另一端的 web 服务会 get 123E6x9,这会失败。

所以,你的例子已经是正确的,你不需要做任何事情。

如果出于某种原因,您在APP_KEY到达这里之前已经进行了 URL 编码……好吧,不要。使用这样的名称,我猜它是一个常量文字,只是复制并粘贴到您的模块中,这意味着您必须手动对其进行 URL 编码并复制并粘贴结果。只是不要那样做,你很好。

如果你得到了APP_KEYURL 编码的形式,你总是可以用例如 ,urlparse.parse_qs甚至用来解码它furl

但如果这一切似乎都不合理……</p>

有没有办法用 furl 做到这一点?

否。请参阅文档的编码部分。furl仅适用于解码的查询字符串名称和值。

但是有一个简单的方法可以解决这个问题。URL 并没有那么复杂,furl它专门设计用于允许您混合和匹配手动和编程创建的位。自述文件中的大多数示例都准确地表明了这一点,例如furl('http://www.google.com/?one=1').add({'two':2}).url. 因此,如果您已经"key=123%25456%25789"从某个地方获得了预编码,只需手动将其粘贴在字符串上,然后再将其提供给furl

request_url = furl('http://www.domain.com/service/?key={}'.format(APP_KEY)) \
    .add({
    'format'     : 'json',
    'location'      : address_line_1 + ',' + city + ',' + state,
}).url

哈基?好吧,是的,因为您正在回避furl的编码,但这正是您要问的问题。

于 2013-04-06T00:27:36.193 回答