python发送http请求

我在使用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 库,不过你有些特殊符号还是不能发,因为对方服务器会截断这些参数

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7419668
  • 除此之外, 这篇博客: python 网络编程面试题中的 7. HTTP 协议状态码有什么用,列出你知道的 HTTP 协议的状态码,然后讲出他们都 表示什么意思? 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    通过状态码告诉客户端服务器的执行状态,以判断下一步该执行什么操作。 常见的状态机器码有:

    100-199:表示服务器成功接收部分请求,要求客户端继续提交其余请求才能完成整个处理过程。

    200-299:表示服务器成功接收请求并已完成处理过程,常用 200(OK 请求成功)。

    300-399:为完成请求,客户需要进一步细化请求。302(所有请求页面已经临时转移到新的 url)。

    304、307(使用缓存资源)。

    400-499:客户端请求有错误,常用 404(服务器无法找到被请求页面),403(服务器拒绝访问, 权限不够)。

    500-599:服务器端出现错误,常用 500(请求未完成,服务器遇到不可预知的情况)。

  • 以下回答来自chatgpt:

    回答:

    使用requests库或urllib3库发送HTTP GET请求时,无论是在url中直接拼接参数,还是使用params参数传递参数,都会自动将参数进行urlencode编码。如果希望禁止编码,需要手动处理。

    以下是具体的解决方案:

    1.手动构造url

    可以手动构造url,将参数直接拼接在url后面。注意需要对参数值进行特殊字符的转义,避免出现非法字符导致请求失败的情况。

    下面是一个示例代码:

    import requests
    
    url = 'http://example.com/path?' + 'param1=value1&param2=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后面,即可完成整个请求过程。

    需要注意的是,手动编码参数可以禁止库自动进行编码,但同时也增加了代码的复杂度和难度,需要手动处理各种特殊字符和转义符。建议仅在必要情况下使用。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^