【问题标题】:How to prevent python requests from percent encoding URLs contain semicolon?如何防止来自百分比编码 URL 的 python 请求包含分号?
【发布时间】:2016-10-09 10:22:02
【问题描述】:

我想将一些数据发布到像http://www.google.com/;id=aaa这样的网址
我使用以下代码:

url = 'http://www.google.com/;id=aaa'
r = requests.post(url, headers=my_headers, data=my_data, timeout=10)

不幸的是,我发现 requests 只是在没有任何警告的情况下将我的 uri 剪切为 http://www.google.com/...

有没有办法以原始形式传递参数 - 没有百分比编码?

我尝试了config={'encode_uri': False},但它被放弃了,urllib.unquote 也没有用。

谢谢!

【问题讨论】:

  • 你的意思是有一个';'在您的目标网址中?
  • 你为什么用分号?
  • @Acepcs 是的...我只是使用这个 API。
  • 你在说什么 API?在你的 url 中有一个分号是没有意义的,如果你传递了那个 url,请求也会出错
  • @PadraicCunningham 是的...我不知道为什么他的 API 请求中有分号...

标签: python http python-requests


【解决方案1】:

RFC 2616, section 3.2.2 指定 HTTP URL 的语法为:

http_URL = "http:" "//" host [ ":" port ] [ abs_path [ "?" query ]]

它还说:

如果 URL 中不存在 abs_path,则必须在以下情况下将其指定为“/” 用作资源的 Request-URI

在这个网址中:

http://www.google.com;id=aaa

没有/,所以没有abs_path,也没有:,所以没有port。这意味着www.google.com;id=aaa 是主机名。

主机名中不允许使用分号(请参阅this answer 了解主机名中允许的内容),因此此URL 无效

如果id=aaa 应该是路径的一部分,这将是一个有效的 URL:

http://www.google.com/;id=aaa

这也是,如果id=aaa 应该是查询的一部分:

http://www.google.com/?;id=aaa

编辑

问题已修改为询问http://www.google.com/;id=aaa

那个 URL 是有效的,据我测试, 可以毫无问题地处理它。

【讨论】:

  • e...(๑Ő௰Ő๑)对不起..网址应该是google.com/;id=aaa
  • post 数据是在请求正文中发送的,而不是作为查询发送,所以http://www.google.com/?;id=aaa 没有任何意义,除非还有预期的查询参数。
  • @PadraicCunningham 在 HTTP POST 的上下文中查询有点尴尬,但我相信它是合法的,应该得到支持。
  • 它是有效的,但根据 OP 而不是这里发生的事情。这个问题无法回答,因为 OP 没有提供任何文档,所以只有他/她知道 API 的预期内容。
  • @PadraicCunningham 是的,好吧,这回答了最初的问题。现在问题已经“固定”了,我相信它没有答案。可能问题出在服务器端,我们没有看到。
猜你喜欢
  • 2014-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-27
  • 1970-01-01
  • 2014-01-21
  • 2022-06-14
  • 2012-04-20
相关资源
最近更新 更多