python - 传递数据时python socket http库发布请求不起作用
问题描述
正如我的标题所说,我正在制作一个带有基本 get 和 post 请求的小型 http 库。我已经完成了获取请求,但是我的发布请求表现得很奇怪。每当我将数据传递给帖子时,它都没有得到响应。当我不通过 body 属性(最后一个)时,它似乎工作得很好。我没有尝试使用请求库,我正在尝试自己制作一个。
谁能看到我做错了什么?我觉得我错过了一个标题,但我不知道是哪个。
import socket
from urllib.parse import urlparse
import json
TCRLF = "\r\n\r\n"
CRLF = "\r\n"
def post(url, headers=None, data=""):
connection = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
request = build_request("POST", url, headers, data)
print("request: " + request)
print("url:" + url)
print("headers :" + str(headers))
url = urlparse(url)
connection.connect((url.hostname, url.port or 80))
connection.sendall(request.encode("UTF-8"))
response = connection.recv(4096).decode("UTF-8")
print("response: " + response)
#
# (response_header, response_body) = response.split(TCRLF)
# response_body = json.loads(response_body)
#
# print(response_header)
# print(response_body)
return None
def build_request(req_type, url, headers=None, body=""):
url = urlparse(url)
hostname = url.hostname
path = url.path or "/"
query = url.query
port = url.port or 80
print("hostname" + hostname)
print("path : " + path)
print("query :" + query)
print("port :" + str(port))
print("body:" + str(body))
uri = "{}?{}".format(path, query) if query else path
formatted_headers = "".join(
"{}:{}\r\n".format(k, v) for k, v in headers.items())
print("formatted: "+ formatted_headers)
requestGet = "GET " + uri + " HTTP/1.0" + CRLF + "Host:" + hostname + CRLF + formatted_headers + TCRLF
##TODO body failing when passing object
requestPost = "POST " + uri + " HTTP/1.0" + CRLF + "Host: " + hostname + CRLF + "Content-Length: " + str(
len(body)) + CRLF + formatted_headers + TCRLF + body + TCRLF
print("Request" + requestPost)
if req_type=="POST":
return requestPost
else:
return requestGet
def main():
post("http://httpbin.org/post", {"Content-Type": "application/json" }, "{'Assignment': 1}")
if __name__ == '__main__':
main()
解决方案
body = '{"name":"mandar"}'
length = len(body)
#request = "GET / HTTP/1.1\r\nHost:%s\r\nUser-Agent: Mandar\r\n\r\n" % serverHost
p = HttpParser()
request = "POST / HTTP/1.1\r\nHost:{0}\r\nUser-Agent:Mandar\r\nContent-Type: application/json\r\nContent-Length: {1}\r\n\r\n{2}\r\n".format(serverHost, length, body)
推荐阅读
- html - 将存储在 HTML5 localstorage 中的值相加
- docker - 如何在 Dockerfile 中将用户输入作为文本发送?
- node.js - 使用 Node.js 通过 SQLite 插入值时的主键问题
- c++ - 使用 static_cast 创建的枚举调用 C++ 函数的安全性
- python-3.x - 每当将新数据加载到 s3 存储桶中时如何触发 python 脚本?
- javascript - 有没有办法在 Chrome 和 Firefox 中的 JavaScript 中获取触控板强制事件?
- reactjs - Reactjs - 使用 oneOfType 检查 proptypes
- python - 试图绘制特征方程的特征值(根轨迹)图作为一个变量增加但得到一个空白图?
- c++ - 使用虚函数的 C++ 中的嵌套多态性
- java - 使用 moditect 将模块信息添加到依赖项而不下载依赖项