python - 使用 Socket 发送原始 POST 请求

标签 python sockets http webdriver

我正在尝试向 chromedriver 服务器发送原始 POST 请求。

这是我尝试启动一个新 session 的方法:

import socket

s = socket.socket(
    socket.AF_INET, socket.SOCK_STREAM)

s.connect(("127.0.0.1", 9515))

s.send(b'POST /session HTTP/1.1\r\nContent-Type:application/json\r\n{"capabilities": {}, "desiredCapabilities": {}}\r\n\r\n')
response = s.recv(4096)
print(response)

输出:

b'HTTP/1.1 200 OK\r\nContent-Length:270\r\nContent-Type:application/json; charset=utf-8\r\nConnection:close\r\n\r\n{"sessionId":"b26166c2aac022566917db20260500bb","status":33,"value":{"message":"session not created exception: Missing or invalid capabilities\\n  (Driver info: chromedriver=2.31.488763 (092de99f48a300323ecf8c2a4e2e7cab51de5ba8),platform=Linux 4.4.0-91-generic x86_64)"}}'

错误摘要:我发送的 json 对象未被正确解析

当我使用相同的 json 对象但通过 requests 库发送它时,一切正常:

import requests

params = {
        'capabilities': {},
        'desiredCapabilities': {}
    }


headers = {'Content-type': 'application/json'}

URL = "http://127.0.0.1:9515"

r = requests.post(URL + "/session", json=params)

print("Status: " + str(r.status_code))
print("Body: " + str(r.content))

输出:

Status: 200
Body: b'{"sessionId":"e03189a25d099125a541f3044cb0ee42","status":0,"value":{"acceptSslCerts":true,"applicationCacheEnabled":false,"browserConnectionEnabled":false,"browserName":"chrome","chrome":{"chromedriverVersion":"2.31.488763 (092de99f48a300323ecf8c2a4e2e7cab51de5ba8)","userDataDir":"/tmp/.org.chromium.Chromium.LBeQkw"},"cssSelectorsEnabled":true,"databaseEnabled":false,"handlesAlerts":true,"hasTouchScreen":false,"javascriptEnabled":true,"locationContextEnabled":true,"mobileEmulationEnabled":false,"nativeEvents":true,"networkConnectionEnabled":false,"pageLoadStrategy":"normal","platform":"Linux","rotatable":false,"setWindowRect":true,"takesHeapSnapshot":true,"takesScreenshot":true,"unexpectedAlertBehaviour":"","version":"60.0.3112.90","webStorageEnabled":true}}'

输出摘要:json 对象被 chromedriver 成功解析并创建了新 session

伙计们,你们知道为什么使用 socket 发送原始 POST 请求没有按预期工作吗?

最佳答案

关于您的 HTTP 请求有几个问题:

  • HTTP请求的正文和请求头之间应该用\r\n\r\n分隔。
  • 您需要Content-Length字段,否则远程主机不知道您的正文何时完成。
  • Host 字段在 HTTP 1.1 中是强制性的。 (由于您在第一次请求时收到 200,您的服务器可能不会坚持。)

我已经让你的例子工作(使用 apache 网络服务器)通过使用:

s.send(b'POST /session HTTP/1.1\r\nHost: 127.0.0.1:9515\r\nContent-Type: application/json\r\nContent-Length: 47\r\n\r\n{"capabilities": {}, "desiredCapabilities": {}}')

为了视觉上更清晰,有效的 HTTP 请求看起来像

POST /session HTTP/1.1
Host: 127.0.0.1:9515
Content-Type: application/json
Content-Length: 47

{"capabilities": {}, "desiredCapabilities": {}}

关于python - 使用 Socket 发送原始 POST 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45695168/

相关文章:

休息服务 : HTTP code for forcing a change of password

python - Keras 给出错误 - ValueError : Error when checking target: expected dense_3 to have 4 dimensions, 但得到形状为 (10000, 1) 的数组

python - 编辑 : Subprocess wont open python file in new window?

c - receive() 链接消息

python - 套接字发送超时 - 更改是否安全?

c++ - BlackBerry-10 连接功能出错

python - 基于图形的元组合并?

python - 如何打包我的 Python 应用程序并将其添加到我的启动板存储库?

java - 在客户端和服务器之间以字节数组形式发送图像

http - 发出自定义发布请求时出现 400 Bad Request