Отправить многомерный массив с использованием SOAP / PHP [duplicate]

Решение с использованием NOT

Если значения являются логическими, самым быстрым подходом является использование оператора not :

>>> x = True
>>> x = not x        # toggle
>>> x
False
>>> x = not x        # toggle
>>> x
True
>>> x = not x        # toggle
>>> x
False

Решение с использованием вычитания

Если значения являются численными, то вычитание из общего числа является простым и быстрым способом переключения значений:

>>> A = 5
>>> B = 3
>>> total = A + B
>>> x = A
>>> x = total - x    # toggle
>>> x
3
>>> x = total - x    # toggle
>>> x
5
>>> x = total - x    # toggle
>>> x
3

Решение с использованием XOR

Если значение переключается между 0 и 1 , вы можете использовать побитовое исключение или :

>>> x = 1
>>> x ^= 1
>>> x
0
>>> x ^= 1
>>> x
1

Техника работает обобщается на любую пару целых чисел. Шаг xor-one-one заменяется на xor-by-pre -put-constant-constant:

>>> A = 205
>>> B = -117
>>> t = A ^ B        # precomputed toggle constant
>>> x = A
>>> x ^= t           # toggle
>>> x
-117
>>> x ^= t           # toggle
>>> x
205
>>> x ^= t           # toggle
>>> x
-117

(эта идея была представлена ​​Ником Когланом, а затем обобщена @zxxc.)

Решение с использованием словаря

Если значения хешируются, вы можете использовать словарь:

>>> A = 'xyz'
>>> B = 'pdq'
>>> d = {A:B, B:A}
>>> x = A
>>> x = d[x]         # toggle
>>> x
'pdq'
>>> x = d[x]         # toggle
>>> x
'xyz'
>>> x = d[x]         # toggle
>>> x
'pdq'

Решение с использованием условного выражения

Самый медленный способ заключается в использовании условного выражения :

>>> A = [1,2,3]
>>> B = [4,5,6]
>>> x = A
>>> x = B if x == A else A
>>> x
[4, 5, 6]
>>> x = B if x == A else A
>>> x
[1, 2, 3]
>>> x = B if x == A else A
>>> x
[4, 5, 6]

Решение с использованием itertools

Если у вас более двух значений, itertools.cycle ( ) обеспечивает общий быстрый способ переключения между последовательными значениями:

>>> import itertools
>>> toggle = itertools.cycle(['red', 'green', 'blue']).next
>>> toggle()
'red'
>>> toggle()
'green'
>>> toggle()
'blue'
>>> toggle()
'red'
>>> toggle()
'green'
>>> toggle()
'blue'

Обратите внимание, что в Python 3 метод next() был изменен на __next__(), поэтому первая строка будет теперь записанный как toggle = itertools.cycle(['red', 'green', 'blue']).__next__

33
задан the Tin Man 14 May 2012 в 19:45
поделиться

5 ответов

Thanx много приятель, ваш код работал для меня.

Вот код:

$soap_do = curl_init(); 
curl_setopt($soap_do, CURLOPT_URL,            $url );   
curl_setopt($soap_do, CURLOPT_CONNECTTIMEOUT, 10); 
curl_setopt($soap_do, CURLOPT_TIMEOUT,        10); 
curl_setopt($soap_do, CURLOPT_RETURNTRANSFER, true );
curl_setopt($soap_do, CURLOPT_SSL_VERIFYPEER, false);  
curl_setopt($soap_do, CURLOPT_SSL_VERIFYHOST, false); 
curl_setopt($soap_do, CURLOPT_POST,           true ); 
curl_setopt($soap_do, CURLOPT_POSTFIELDS,    $post_string); 
curl_setopt($soap_do, CURLOPT_HTTPHEADER,     array('Content-Type: text/xml; charset=utf-8', 'Content-Length: '.strlen($post_string) )); 
curl_setopt($soap_do, CURLOPT_USERPWD, $user . ":" . $password);

$result = curl_exec($soap_do);
$err = curl_error($soap_do);  
36
ответ дан Cody Gray 23 August 2018 в 22:40
поделиться

Вы также используете неправильный Content-type, application / xml - правильный тип. Но это не должно иметь никакого значения для запроса cURL.

1
ответ дан Adam 23 August 2018 в 22:40
поделиться

Попробуйте установить номер порта с помощью CURLOPT_PORT, поскольку, возможно, ему не нравится это как часть URL?

2
ответ дан Alistair 23 August 2018 в 22:40
поделиться

Для тех, кто нашел это у Google, у меня возникла аналогичная проблема, пытаясь взаимодействовать с сервером .NET SOAP с PHP, когда метод ASP работал нормально.

Я использовал сниффер пакетов, чтобы видеть что именно посылал клиент ASP, и заметил, что он включил куки после первоначального запроса на аутентификацию. Поэтому я включил файлы cookie в моем cURL, и он работал нормально.

$cookiePath = tempnam('/tmp', 'cookie');
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookiePath);
4
ответ дан Tobias Fünke 23 August 2018 в 22:40
поделиться

Это может быть старым, но эта работа для меня. Первоначально я использовал эту функцию для сообщения XML, и мыло не работало, пока я не изменю HTTPHEADER на text/xml вместо application/xml:

function doXMLCurl($url,$postXML){
    $CURL = curl_init();

    curl_setopt($CURL, CURLOPT_URL, $url); 
    curl_setopt($CURL, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); 
    curl_setopt($CURL, CURLOPT_POST, 1); 
    curl_setopt($CURL, CURLOPT_POSTFIELDS, $postXML); 
    curl_setopt($CURL, CURLOPT_HEADER, false); 
    curl_setopt($CURL, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($CURL, CURLOPT_HTTPHEADER, array('Accept: text/xml','Content-Type: text/xml'));
    curl_setopt($CURL, CURLOPT_RETURNTRANSFER, true);
    $xmlResponse = curl_exec($CURL); 

    return $xmlResponse;
}
11
ответ дан whoan 23 August 2018 в 22:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: