2017-01-20 14 views
-1

Рабочий процесс: я отправляю билет на сервер, сервер будет отвечать необходимой мне информацией. Например,Как использовать библиотеку запросов для отправки данных на сервер?

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" и двоичных данных (только с данными и не ключ) все сразу? Если я отправляю только двоичные данные, я могу использовать «файлы». Но как отправить всю эту информацию на сервер? Наглядно это будет больше похоже на это (но, очевидно, он не будет работать):

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

Для comolete этой задачи, есть часть 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 (с использованием Запросов или нет, оба приемлемы).

ответ

1

Это не проблема модулей запросов. Если мы считаем, что вы можете отправлять какую-либо структуру данных с помощью запросов, вам придется найти такую ​​структуру данных, которая позволит вам ссылаться на ваши данные с помощью ключа, а если ключ не указан, он будет возвращать двоичные данные по умолчанию стоимость. К сожалению, словарь python не позволяет этого, потому что существует общее согласие в том, что в словаре мы ссылаемся на данные с помощью ключей.

EDIT: Вы могли бы начать с помощью фактической реализации Словаре использования

class kldict(dict): 
    def __init__(self, default, *args, **kwargs): 
     self.store = dict() 
     self.update(dict(*args, **kwargs)) 
     self.default = default 

    def update(self, *args, **kwargs): 
     for k, v in dict(*args, **kwargs).iteritems(): 
      self.store[self.__keytransform__(k)] = v 

    def __setitem__(self, key, value): 
     self.store[self.__keytransform__(key)] = value 

    def __delitem__(self, key): 
     del self.store[self.__keytransform__(key)] 

    def __getitem__(self, key=None): 
     if key: 
      return self.store[self.__keytransform__(key)] 
     else: 
      return self.default 

    def __len__(self): 
     return len(self.store) 

    def __keytransform__(self, key): 
     return key 

    def __repr__(self): 
     return self.default 

Sample будет что-то вроде этого:

var = kldict('0111010110110', {'C': 'D'}) 
var['B'] = 'G' 
print(var['B']) 
print(var['C']) 
print(var[None]) 
print(var) 

Какие результаты в:

G 
D 
0111010110110 
0111010110110 
+0

Право, он не должен быть словарем в этом случае, просто хотите знать, как отправлять данные с помощью ключа и без ключа в один билет. –

0

На этот вопрос слишком мало деталей, чтобы точно ответить, но в любом случае это попытка.

Это кажется, как будто вы хотите отправить данные, отформатированные как это на сервер:

A=1&B=2&1010110111100110...101010 

Если это так, то прошу не имеет не способа сделать это для вас. Он обрабатывает только наиболее распространенных прецедентов для использования. Если предположить, что это формат, который вы хотите, однако, вы должны обеспечить строковые себя, например, так:

import urllib.parse 

import requests 

data = urllib.parse.urlencode({'A': '1', 'B': '2'}) + '1010110111100110...101010' 
response = requests.post(url, data=data) 

Тем не менее, если вы не укажете Content-Type это возможно, что сайт не поймет данные, которые вы отправили. При использовании этой формы вы можете нужно также пройти

headers={'Content-Type': '...'} 

Для requests.post. Я использую ..., потому что мне непонятно, что Content-Type этот сайт ожидает.

 Смежные вопросы

  • Нет связанных вопросов^_^