如何在python中发送http响应消息代码:400

Posted

技术标签:

【中文标题】如何在python中发送http响应消息代码:400【英文标题】:how to send http response message code:400 in python 【发布时间】:2015-06-01 21:09:33 【问题描述】:

我用 python 编写了一个 Web 服务器,我想发送 HTTP 响应消息代码:400 而不是响应“网站即将推出!”如有任何客户请求,请告诉我该怎么做。

服务器代码为:

import socket
import re
HOST = "localhost"
PORT = 13555

listen_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
listen_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
listen_socket.bind((HOST, PORT))
listen_socket.listen(1)
print ("Serving HTTP on port %s ..." % PORT)

while True:
    client_connection, client_address = listen_socket.accept()
    request = client_connection.recv(2048)
    response = "Website Coming Soon!"   #this response should be http response message code:400
    http_response = "HTTP/1.1 200 OK\n"+"Content-Type: text/html\n"+"\n"+"<html><body>"+response+"</body></html>\n"
    client_connection.sendall(http_response)
    client_connection.close()

【问题讨论】:

您需要发送HTTP/1.1 400 Bad Request 而不是HTTP/1.1 200 OK 我看不到您发送内容长度的位置。 现在我正在使用 http_response = "HTTP/1.1 400 Bad request\n"+"Content-Type: text/html\n" 但浏览器没有显示任何内容 【参考方案1】:

尝试了解您要说的协议:)

HTTP 相当简单,所有 HTTP 消息都由 3 个基本部分组成,其中第 3 个是可选的:

请求或状态行(第一行) 请求标头,每个位于一行(或一些转义分布在多行),后跟一个额外的换行符 请求正文,对于大多数请求和某些响应是可选的。

您要做的是更改响应消息中的“状态行”。由于您要发送 400 状态代码,因此响应中的第一行应该是

HTTP/1.1 400 Bad request

但是这里有两点不对:

    您实际上并没有解析请求,因此您无法真正告诉客户端他做错了什么(所有 4xx 代码代表客户端错误) 您发送了错误的信息。可能你想要的是503 Service unavailable

深入了解specs。他们是真的真的直截了当。如果你仔细阅读它,并按照预期的方式开始使用 HTTP,世界会变得更好;)

【讨论】:

现在我正在使用 http_response = "HTTP/1.1 400 Bad request\n"+"Content-Type: text/html\n" 但浏览器没有显示任何内容 您在标题后缺少额外的换行符。 @SajalAli 请在提出此类问题之前阅读 RFC 2616。顺便说一句,您缺少“\r”,但这在 RFC 中有明确记录。

以上是关于如何在python中发送http响应消息代码:400的主要内容,如果未能解决你的问题,请参考以下文章

如何告诉HTTP服务器不发送分块编码

如何仅使用套接字库通过 Python 正确发送 HTTP 响应?

如何让我的机器人获取已经从频道中的用户发送的随机消息,并在触发自动响应时发送该随机消息

Discord BOT python,如何在特定用户编写命令时发送消息

微信公众平台如何通过php代码给会员发送被动响应消息

Python HTTP服务器在POST和GET请求时没有响应