基于Python Socket实现HTTP DELETE方法遇400错误求助
问题:HTTP DELETE请求返回400 Bad Request(无效主机名)
我已成功实现HTTP的GET、HEAD、POST和OPTIONS方法,这些方法均可正常运行,但无法实现DELETE方法。
我的代码
import socket # creating socket instance # socket.AF_INET = IPV4 # type=socket.SOCK_STREAM = TCP s = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM) # target ip address and port ip_address = '127.0.0.1' port = 80 # Connection port # instance requesting for connection to the specified address and port try: s.connect((ip_address,port)) # Send the DELETE request request = "DELETE /fmweb/test.html HTTP/1.1\r\n" request = request + "Accept: text/html\r\n\r\n" response = s.send(request.encode()) response = s.recv(4096) print(response.decode()) except: print("Error") finally: s.close()
错误响应
我尝试在IIS中添加DELETE谓词并做了多种配置,但问题仍未解决,返回的错误响应如下:
HTTP/1.1 400 Bad Request Content-Type: text/html; charset=us-ascii Server: Microsoft-HTTPAPI/2.0 Date: Thu, 20 Jul 2023 15:49:47 GMT Connection: close Content-Length: 334 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd"> <HTML><HEAD><TITLE>Bad Request</TITLE> <META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"></HEAD> <BODY><h2>Bad Request - Invalid Hostname</h2> <hr><p>HTTP Error 400. The request hostname is invalid.</p> </BODY></HTML>
问题分析与修复方案
核心问题
错误提示明确指向无效主机名,这是因为HTTP/1.1协议要求所有请求必须包含Host头部字段,你的DELETE请求里缺少了这个必填项。虽然之前的GET、POST等方法可能在部分服务器兼容配置下能正常执行,但严格遵循HTTP/1.1规范的服务器会拒绝没有Host头的请求。
代码修复
只需在请求中添加Host头部即可:
# 修改后的请求构建代码 request = "DELETE /fmweb/test.html HTTP/1.1\r\n" request += "Host: 127.0.0.1\r\n" # 新增Host字段,值与目标IP一致 request += "Accept: text/html\r\n\r\n"
IIS配置补充检查
即使修复了请求,仍需确保IIS侧配置正确:
- 确认对应站点的请求筛选规则中已允许DELETE谓词
- 检查目标资源所在的应用程序池具备足够权限执行删除操作
- 若目标是静态HTML文件,IIS默认不允许直接删除静态资源,需通过动态处理程序(如ASP.NET、PHP等)来实现删除逻辑
内容的提问来源于stack exchange,提问作者Fazal Masud Kundi
相关产品推荐
相关产品推荐

