簡體   English   中英

使用套接字發送原始POST請求

[英]Send raw POST request using Socket

我正在嘗試將原始POST請求發送到chromedriver服務器。

這是我嘗試啟動new 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}}'

輸出摘要: chromedriver成功解析了json對象,並創建了new session

你們是否知道為什么使用socket發送原始POST請求無法按預期工作?

有關您的HTTP請求的幾個問題:

  • HTTP請求的主體應與\\r\\n\\r\\n分開。
  • 您需要“ Content-Length字段,否則遠程主機不知道您的身體何時完成。
  • 在HTTP 1.1中,“ Host字段是必填字段。 (由於您的第一個請求收到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": {}}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM