Как отправить пару ключ-значение и двоичную информацию вместе на сервер с помощью Python

В процессе я отправляю билет на сервер, сервер ответит необходимой мне информацией. Например,

import requests
URL = "https://ssl.XXX.com/sql_v5i.php"Ticket = {"A":"1","B":"2"}  # a dictionary
ticket_post = requests.post(URL, data=Ticket)
print ticket__post.text

Но как отправить Билет с "A":"1", "B":"2" и двоичные данные (только с данными и без ключа) все сразу?

Чтобы решить эту задачу, есть часть работ php:

<?php

$BASE_SERVER_URL="https://ssl.XXX.com/sql_v5i.php"$TICKET = array(
'fn' => 'ticket',
'testid' => '2'
... # And many other key-value pair in the TICKET array
);

class DataStreamer{
private $data;
private $pos;

function __construct($data) {
$this->data = $data;
$this->pos = 0;
}

function stream_function($handle, $fd, $count){
$res = substr($this->data, $this->pos, $count);
$this->pos += strlen($res);
return $res;
}
}

function sendTicketToServer($data) {
global $TICKET, $BASE_SERVER_URL; # TICKET is an array stores ticket
#  information in php
$ret = array(true);
$postFields = "";
foreach ($TICKET as $name => $val)
$postFields = (empty($postFields) ? "" :  "${postFields}&") ."${name}=" . urlencode($val);

$ch = curl_init();

curl_setopt( $ch, CURLOPT_POST, true );
curl_setopt( $ch, CURLOPT_URL, "${BASE_SERVER_URL}?" . $postFields );
# add key-value pairs
curl_setopt( $ch, CURLOPT_VERBOSE, false );
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, FALSE );
curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, FALSE );

if (!empty($data)) { # data is the binary string , add binary string
curl_setopt( $ch, CURLOPT_BINARYTRANSFER, true);
curl_setopt( $ch, CURLOPT_HEADER, true);
curl_setopt( $ch, CURLOPT_HTTPHEADER, array('Content-type: application/octet-stream', 'Content-length: ' . strlen($data)));
curl_setopt( $ch, CURLOPT_READFUNCTION, array(new DataStreamer($data), "stream_function"));
} else {
curl_setopt( $ch, CURLOPT_HTTPHEADER, array('Content-type: application/octet-stream', 'Content-length: 0'));
}

$resp = curl_exec($ch);
$code=curl_getinfo($ch, CURLINFO_HTTP_CODE);
if( $resp === FALSE || $code !== 200 ) {
echo "!!!!! Failed to get connection from the server. Code:    $code\n";
return array(ERR_NO_SERVER_CONNECTION."000");
}

curl_close($ch);
return $ret;

Как сделать то же самое в Python (допустимо использование запросов или нет).

Двоичные_данные = «U5UU ǚ h V «

0

Решение

PHP пример не отправляет Ticket как POST данные, но как GET данные — значит в URL

https://ssl.XXX.com/sql_v5i.php?A=1&B=2

Ты можешь использовать params=Ticket сделать то же самое в requests, И тогда вы можете использовать data= или же files= отправить двоичные данные.

Я пользуюсь специальным порталом httpbin.org проверить запрос, но вашему порталу может потребоваться больше работы.

import requests

url = "http://httpbin.org/post"ticket = {"A":"1","B":"2"}
binary_data = b'hello world'

headers = {
'Content-type': 'application/octet-stream',
}

r = requests.post(url, params=ticket, data=binary_data, headers=headers)

print('--- requests ---')
print(r.url)
print(r.request.headers)
print(r.request.body)

print('--- response ---')
print(r.text)

Результат:

--- requests ---
http://httpbin.org/post?B=2&A=1
{'Content-type': 'application/octet-stream', 'Accept-Encoding': 'gzip, deflate', 'Content-Length': '11', 'User-Agent': 'python-requests/2.12.1', 'Connection': 'keep-alive', 'Accept': '*/*'}
b'hello world'
--- response ---
{
"args": {
"A": "1",
"B": "2"},
"data": "hello world",
"files": {},
"form": {},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Content-Length": "11",
"Content-Type": "application/octet-stream",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.12.1"},
"json": null,
"origin": "xxx.xxx.xxx.xxx",
"url": "http://httpbin.org/post?B=2&A=1"}

Вы также можете использовать локальный прокси-сервер (т.е. Чарльз) сравнить запрос PHP с запросом Python.

PHP:

curl_setopt($ch, CURLOPT_PROXY, '127.0.0.1:8888');

Python:

proxy = {
'http': '127.0.0.1:8888',
'https': '127.0.0.1:8888',
}

r = requests.post(url, params=ticket, data=binary_data,
headers=headers, proxies=proxy)

введите описание изображения здесь

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]