首页 > 解决方案 > 带有标头的Python套接字发布json请求

问题描述

我需要非常重要的时间(以毫秒为单位)并且需要非常快的发送后 json 请求套接字非常快我通过套接字发送数据但是在等待运行脚本之后没有响应

代码

import socket
import time
import ssl
start_time1 = time.time()
target_host = "site.com" 
context = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
target_port = 443  # create a socket object
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(( target_host,443 ))
s = context.wrap_socket(s,server_hostname=target_host)

request = "POST /api/send HTTP/1.1\r\nHost:site.com\r\nUser-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0\r\nCookie: .ASPXAUTH=D6CA254ED2327019933D1746092C47DD2884398658FF3DCAD213B8B9F0F73F7A67BC0C483F316F76195B49BC2C487783F9C73009B3469F1F7BCE6286C6C16A45916A013285E23808DED1C2F8E65262C377923823B538CFCC;\r\n{'IsSymbolCautionAgreement': 'false', 'CautionAgreementSelected': 'false', 'IsSymbolSepahAgreement': 'false', 'SepahAgreementSelected': 'false', 'orderCount': 112, 'orderPrice': 45150, 'FinancialProviderId': '1', 'minimumQuantity': '', 'maxShow': '0', 'orderId': '0', 'isin': 'IRO7NIRP0001', 'orderSide': '65', 'orderValidity': '74', 'orderValiditydate': 'null', 'shortSellIsEnabled': 'false', 'shortSellIncentivePercent': '0'}"
s.send(request.encode())
response = s.recv( 9999 )
s.close()
print request
print response + '\n'
print("--- %s seconds-total ---" % (time.time() - start_time1))

标签: pythonjsonsocketspost

解决方案


由于缺乏对 HTTP 工作原理的了解,您的代码存在多个问题:

  • 没有Content-length描述 HTTP 正文的长度
  • HTTP 标头和正文之间没有适当的分隔符
  • 并且您的代码隐式使用 HTTP keep-alive,但仍然错误地期望服务器在响应完成后立即关闭连接

我需要以毫秒为单位的非常重要的时间,并且需要非常快的发送后 json 请求套接字非常快

这是使用普通套接字而不是使用 HTTP 库的常用但通常错误的原因。开销不在于本地代码,而在于连接建立和数据传输,即网络 I/O 和网络延迟。与简单地使用套接字相比,已建立的库在保持相关开销较小方面做得更好:适当的库可以通过同一个 TCP 连接使用多个 HTTP 请求,可以使用压缩内容,可以处理 TLS 会话恢复等 - 所有这些都是与本地执行代码的复杂性相比,与性能更相关。

如果您仍然坚持运行自己的 HTTP 堆栈,那么请学习并遵循实际标准,而不是实现您自己对 HTTP 可能是什么样子的想法。


推荐阅读