如何在发送GET请求时将用户输入传入send()方法
问题原因与解决方法
报错根因
你收到的类型错误来自cmd构造行的类型混用:'GET '是普通字符串类型,in_bytes是提前转好的bytes类型,'HTTP/1.0\r\n\r\n'.encode()也是bytes类型,字符串和bytes不能直接拼接,才触发了该报错。
另外你的代码还有两个会导致后续运行失败的逻辑问题:
- try块中连接成功后直接调用了
soc_open.close(),后续发送请求时用的是已经关闭的socket,必然会报错 - GET请求行的结构错误:GET后面需要跟的是URL的路径部分,不是完整的URL地址
修正步骤
- 所有请求内容先拼接为完整字符串,最后统一转bytes,不要中途混合类型
- 删除try块中多余的socket关闭语句
- 拆分URL时分别提取域名和请求路径,构造符合HTTP规范的请求行
修正后可运行代码
import socket response = input("Enter a valid URL: ") soc_open = socket.socket(socket.AF_INET, socket.SOCK_STREAM) try: tray = response.split('/') # 提取域名和请求路径 host = tray[2] path = '/' + '/'.join(tray[3:]) soc_open.connect((host, 80)) print("Worked!") except: print("ERROR: Invalid URL") soc_open.close() exit() # 先拼完整字符串再统一转bytes cmd = f'GET {path} HTTP/1.0\r\nHost: {host}\r\n\r\n'.encode() soc_open.send(cmd) while True: data = soc_open.recv(512) if len(data) < 1: break print(data.decode(), end='') soc_open.close()
补充说明:新增了Host请求头,兼容现在大部分多站点部署的服务器,避免返回400错误
内容的提问来源于stack exchange,提问作者John David K. Kudadjie
相关产品推荐
相关产品推荐

