我在使用Python发送HTTP的GET请求的时候,我发现无论使用requests还是urllib3进行请求,url后面的参数都会被urlencode编码,除了重写底层代码,有没有其它办法让它不进行url编码进行发送呢,就比如说http://127.0.0.1/index.php?p=,都会变成
http://127.0.0.1/index.php?p=%3C?=phpinfo();?%3E
但是我就想直接这样在发送的时候是http://127.0.0.1/index.php?p=,不进行编码。
请求各位师傅,可有解决办法?
你的问题是,在使用requests或urllib发送GET请求时,URL参数会被自动编码,但你希望不对参数进行编码直接发送。解决这个问题有两种办法:1. 手动构造URL,不使用库自动编码你可以直接构造完整的URL字符串,而不使用requests或urllib的GET参数设置方法。例如:
url = 'http://127.0.0.1/index.php?p=<?=phpinfo();?>'
requests.get(url)
这样requests就会直接使用你构造的URL字符串发送请求,不会对其进行任何编码。2. 使用params参数,指定编码为Nonerequests和urllib都允许你通过params参数手动设置URL参数与值,并指定其编码方式。例如,requests中:
requests.get('http://127.0.0.1/index.php',
params={'p': '<?=phpinfo();?>'},
encode_params=None)
通过设置encode_params=None,可以指定不对params中的参数与值进行编码。urllib中类似的设置参数为urlfeldandvalues,该参数需为一个list,格式为:
[("urlparam1", "value1"), ("urlparam2", "value2")]
然后在构造Request对象时,设置urlencode=False,例如:
req = urllib.request.Request("http://127.0.0.1/index.php",
urlfeldandvalues,
encode_params=False)
这两种方法都可以解决你的问题,实现在发送GET请求时不对URL参数进行编码。
可以试试看用 inet 库,不过你有些特殊符号还是不能发,因为对方服务器会截断这些参数
不知道你这个问题是否已经解决, 如果还没有解决的话:通过状态码告诉客户端服务器的执行状态,以判断下一步该执行什么操作。 常见的状态机器码有:
100-199:表示服务器成功接收部分请求,要求客户端继续提交其余请求才能完成整个处理过程。
200-299:表示服务器成功接收请求并已完成处理过程,常用 200(OK 请求成功)。
300-399:为完成请求,客户需要进一步细化请求。302(所有请求页面已经临时转移到新的 url)。
304、307(使用缓存资源)。
400-499:客户端请求有错误,常用 404(服务器无法找到被请求页面),403(服务器拒绝访问, 权限不够)。
500-599:服务器端出现错误,常用 500(请求未完成,服务器遇到不可预知的情况)。
回答:
使用requests库或urllib3库发送HTTP GET请求时,无论是在url中直接拼接参数,还是使用params参数传递参数,都会自动将参数进行urlencode编码。如果希望禁止编码,需要手动处理。
以下是具体的解决方案:
1.手动构造url
可以手动构造url,将参数直接拼接在url后面。注意需要对参数值进行特殊字符的转义,避免出现非法字符导致请求失败的情况。
下面是一个示例代码:
import requests
url = 'http://example.com/path?' + 'param1=value1¶m2=value2'
response = requests.get(url)
其中,param1和param2是参数名,value1和value2是参数值。通过将它们用等号连接起来,再用&符号连接多个参数,就可以直接构造出完整的url。
2.手动编码参数
如果希望使用params参数传递参数,但不想让库进行自动编码,可以手动对参数进行编码,然后再将它们传递给库函数。
以下是示例代码:
import requests
import urllib.parse
params = {'param1': 'value1', 'param2': 'value2'}
param_str = '&'.join([key + '=' + urllib.parse.quote_plus(value) for key, value in params.items()])
url = 'http://example.com/path?' + param_str
response = requests.get(url)
其中,urllib.parse.quote_plus()函数可以将参数进行转义,将特殊字符转化为%XX的形式。然后使用&符号连接多个参数,再将其拼接到url后面,即可完成整个请求过程。
需要注意的是,手动编码参数可以禁止库自动进行编码,但同时也增加了代码的复杂度和难度,需要手动处理各种特殊字符和转义符。建议仅在必要情况下使用。