Как отправить Запрос SOAP от PHP

UPDATE - April '15:

Если вы хотите получить счет, который доступен в кнопке Like, вы должны использовать поле engagement в объекте og_object, например:

https://graph.facebook.com/v2.2/?id=http://www.MY-LINK.com&fields=og_object{engagement}&access_token=

Результат:

{
  "og_object": {
    "engagement": {
      "count": 93, 
      "social_sentence": "93 people like this."
    }, 
    "id": "801998203216179"
  }, 
  "id": "http://techcrunch.com/2015/04/06/they-should-have-announced-at-420/"
}

Возможно, с помощью Graph API просто используйте:

http://graph.facebook.com/?id=YOUR_URL

что-то вроде:

http://graph.facebook.com/?id=http://www.google.com

Вернул бы:

{
   "id": "http://www.google.com",
   "shares": 1163912
}

UPDATE: в то время как выше ответит, как получить счет share . Это число не совпадает с тем, которое вы видите на кнопке Like , так как это число является суммой:

  • Число подобных этому URL
  • Количество акций этого URL-адреса (включая копирование / вставка ссылки на Facebook)
  • Количество понравившихся и комментариев к рассказам о Facebook об этом URL
  • Количество сообщений в почтовых ящиках, содержащих этот URL, в качестве вложения.

Таким образом, получение номера Like Like возможно с помощью Graph API через конечную точку fql (таблица link_stat ):

https://graph.facebook.com/fql?q=SELECT url, normalized_url, share_count, like_count, comment_count, total_count,commentsbox_count, comments_fbid, click_count FROM link_stat WHERE url='http://www.google.com'

total_count - номер, который отображается в кнопке Like.

49
задан Keltia 22 January 2009 в 22:36
поделиться

2 ответа

По моему опыту, все не так просто. Встроенный PHP SOAP клиент не работал с SOAP-сервером на базе .NET, который нам пришлось использовать. Он жаловался на неправильное определение схемы. Несмотря на то, что клиент .NET работал с этим сервером просто отлично. Кстати, позвольте мне заявить, что функциональная совместимость SOAP - это миф.

Следующим шагом был NuSOAP. Это работало довольно долго. Кстати, ради Бога, не забудьте кэшировать WSDL! Но даже с WSDL кэшированием пользователи жаловались, что эта чертова штука медленная.

Тогда мы решили пойти голыми HTTP, собирая запросы и читая ответы с помощью SimpleXMLElemnt, вот так:

$request_info = array();

$full_response = @http_post_data(
    'http://example.com/OTA_WS.asmx',
    $REQUEST_BODY,
    array(
        'headers' => array(
            'Content-Type' => 'text/xml; charset=UTF-8',
            'SOAPAction'   => 'HotelAvail',
        ),
        'timeout' => 60,

    ),
    $request_info
);

$response_xml = new SimpleXMLElement(strstr($full_response, '<?xml'));

foreach ($response_xml->xpath('//@HotelName') as $HotelName) {
    echo strval($HotelName) . "\n";
}

Обратите внимание, что в PHP 5.2 вам понадобится pecl_http, так как (неожиданно!) HTTP-клиент встроен не будет.

Переход на "голый" HTTP заработал нам более 30% в SOAP-запросах. И с этого момента мы перенаправляем все жалобы на производительность ребятам на сервере.

В конце концов, я бы рекомендовал этот последний подход, а не из-за производительности. Я думаю, что в общем, в динамическом языке, таком как PHP, нет никаких преимуществ от всего этого WSDL/типа управления. Вам не нужна причудливая библиотека для чтения и записи XML, со всеми этими шлейфами генерации и динамическими прокси. Ваш язык уже динамический, и SimpleXMLElement работает просто отлично, и очень прост в использовании. Кроме того, у вас будет меньше кода , что всегда хорошо.

44
ответ дан 7 November 2019 в 11:43
поделиться

Вы могли бы хотеть посмотреть здесь и здесь .

Немного примера кода из первой ссылки:

<?php
// include the SOAP classes
require_once('nusoap.php');
// define parameter array (ISBN number)
$param = array('isbn'=>'0385503954');
// define path to server application
$serverpath ='http://services.xmethods.net:80/soap/servlet/rpcrouter';
//define method namespace
$namespace="urn:xmethods-BNPriceCheck";
// create client object
$client = new soapclient($serverpath);
// make the call
$price = $client->call('getPrice',$param,$namespace);
// if a fault occurred, output error info
if (isset($fault)) {
        print "Error: ". $fault;
        }
else if ($price == -1) {
        print "The book is not in the database.";
} else {
        // otherwise output the result
        print "The price of book number ". $param[isbn] ." is $". $price;
        }
// kill object
unset($client);
?>
3
ответ дан Filip Ekberg 7 November 2019 в 21:43
поделиться
Другие вопросы по тегам:

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