PHP / SOAP - öğrenmeye çalışıyorum, ancak uygulama ile ilgili bir sorun yaşıyorsanız

3 Cevap php

Ben sadece benim birikiminiz biraz genişletmek için, kendimi SOAP öğretmeye çalışıyorum, ama ben bir duvara isabet ettik ve orada bir tür geliştirici yardımcı olabilir merak ettim?

Benim sunucu böylece kurdum:

http://www.domain1.com/server.php

<?php
// Pull in the NuSOAP code
require_once('soap/nusoap.php');
// Create the server instance
$server = new soap_server();
// Initialize WSDL support
$server->configureWSDL('hellowsdl', 'urn:hellowsdl');
// Register the method to expose
$server->register('hello',    // method name
 array('name' => 'xsd:string'),  // input parameters
 array('return' => 'xsd:string'), // output parameters
 'urn:hellowsdl',     // namespace
 'urn:hellowsdl#hello',    // soapaction
 'rpc',        // style
 'encoded',       // use
 'Says hello to the caller'   // documentation
);
// Define the method as a PHP function
function hello($name) {
        return 'Hello, ' . $name;
}
// Use the request to (try to) invoke the service
$HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : '';
$server->service($HTTP_RAW_POST_DATA);
?>

Ve şimdi ben bir ayrı sunucu üzerinde bir istemci ayarlamak için denedim:

http://www.domain2.com/client.php

<?php
// Pull in the NuSOAP code
require_once('soap/nusoap.php');
// Create the client instance
$client = new soapclient('http://domain.com/server.php?wsdl', true);
// Check for an error
$err = $client->getError();
if ($err) {
 // Display the error
 echo '<h2>Constructor error</h2><pre>' . $err . '</pre>';
 // At this point, you know the call that follows will fail
}
// Call the SOAP method
$result = $client->call('hello', array('name' => 'Scott'));
// Check for a fault
if ($client->fault) {
 echo '<h2>Fault</h2><pre>';
 print_r($result);
 echo '</pre>';
} else {
 // Check for errors
 $err = $client->getError();
 if ($err) {
  // Display the error
  echo '<h2>Error</h2><pre>' . $err . '</pre>';
 } else {
  // Display the result
  echo '<h2>Result</h2><pre>';
  print_r($result);
 echo '</pre>';
 }
}
// Display the request and response
echo '<h2>Request</h2>';
echo '<pre>' . htmlspecialchars($client->request, ENT_QUOTES) . '</pre>';
echo '<h2>Response</h2>';
echo '<pre>' . htmlspecialchars($client->response, ENT_QUOTES) . '</pre>';
// Display the debug messages
echo '<h2>Debug</h2>';
echo '<pre>' . htmlspecialchars($client->debug_str, ENT_QUOTES) . '</pre>';
?>

Ama fecking şey çalışma alınamıyor. Sunucu gayet görüntüler - WDSL çıktılarının çok. Ancak istemci / bağlamak ve işlemi tamamlamak edemez. Ben bu mesajı alıyorum:

Warning: SoapClient::SoapClient() expects parameter 2 to be array, boolean given in /home/public_html/slidebank_soap_client.php on line 5

Fatal error: Uncaught SoapFault exception: [Client] SoapClient::SoapClient() [<a href='soapclient.soapclient'>soapclient.soapclient</a>]: Invalid parameters in /home/soap/slidebank_soap_client.php:5 Stack trace: #0 /home/soap/slidebank_soap_client.php(5): SoapClient->SoapClient('http://testing....', true) #1 {main} thrown in /home/public_html/soap/slidebank_soap_client.php on line 5

Stumped Ve bu nerede ...

Herhangi bir fikir?

H

3 Cevap

Ben PHP3 / 4 ile NuSOAP kullanarak bir hayranı olarak kullanılan (yani geri PHP SOAP istemci yerleşik yoktu) ama PHP5 SOAP Client ile ben NuSOAP bu gün için herhangi bir ihtiyaç yok bulabilirsiniz.

SOAP istemci yerleşik bir avantaj PHP5 adlı bunu uygulamak için daha temiz ve daha basit olmasıdır ve sizin için yararlı olabilir gibi bu yüzden (ben yerine bazı NuSOAP kullanmayı tercih biliyorum, ama bir sürü insan görünüşe göre sadece orada farkında değildir o söz "NASIL" kılavuzları bir sürü olarak PHP5) tarih ve bunu söylemeyi ihmal dışında.

Örnek kullanım:

ini_set("soap.wsdl_cache_enabled", "1"); // Set to zero to avoid caching WSDL
$soapClient = new SoapClient('http://www.example.com/webservices/HelloWorldService/?wsdl");     
$result = $soapClient->HelloWorldMethod(array('string' => "hello!"));    
print_r($result);

Hizmet türleri ile ilgili bir not:

RPC / kodlanmış ve bu nedenle çalışmak için zor bir biçimi gibi bir SOAP hizmeti söz konusu olduğunda, ideal bir Belge / Birebir hizmetini yerine, bir RPC / kodlanmış hizmeti uygulamak istiyorsanız, WS-I tarafından onaylanmaz Belge / Literal (her ikisi ile çalışmak çok daha kolay ve tasarım olarak daha mantıklı olan) lehine.

En azından düzgün çalıştığını bildiğiniz bir yolu size birkaç baş ağrısı kaydetmek olabilir, - ile başlamak için, eğer mevcut bir servis karşı bir istemci uygulama denemek isteyebilirsiniz.

Ne yazık ki - bu onları tüketen mükemmel iken - PHP serving Belge / Birebir hizmetler için özellikle büyük desteği yok. Orada bu IIRC için en az bir üçüncü taraf NuSOAP gibi kütüphane, ama oldukça benim için kesmek değildi.

(Bu herhangi modası geçmiş ise, düzeltmeler bekliyoruz.)

Bu thread, özellikle 9. ve 10. cevap, size yardımcı olabilir.

Sadece durumda bazı googlers bulmak bu ...

Ccheneson önerdiği gibi ben php.ini düzenlenmiş ve bu kod hatta aynı dev sunucu üzerinde sadece iyi çalıştı.

İstemci - PHP modunda bir Drupal sayfasında merkezli:

<?php
# URL for the service WSDL
ini_set("soap.wsdl_cache_enabled", "0"); // Set to zero to avoid caching WSDL
try {
    // Get a service proxy from the WSDL
    $proxy = new SoapClient('http://testing.domain.com/soap.php?wsdl');
    global $user;
    if (is_array($user->roles) && in_array('group1', array_values($user->roles))) {
        // User is logged in and is in the usergroup, perform login
        $id = $user->uid;
        $key = 1234; 
        $hashgenerator = $key . "xyz" . $id . "randomstringhere";
        $hash = sha1($hashgenerator);
        // Call a method on the service via the proxy
        $result = $proxy->handshake($id, $key, $hash);
        if ($hash==$result) {
            //Send all user details
            profile_load_profile($user);
            $email = $user->mail;
            $fname = $user->{profile_firstname};
            $lname = $user->{profile_lastname};
            $phone = $user->{profile_phone};
            $fax = $user->{profile_fax};
            $dept = "Speakers";
            $role = "Speakers";
            //Send request
            $authresult = $proxy->authlogin($id, $email, $fname, $lname, $phone, $fax, $authgroup);
            if ($authresult=='ok') {
                //Logged in, show them the page
                $_SESSION['loggedin'] = 1;
            } else {
                echo "Error 3";         
            }
        } else {
            echo "Error 2"; 
        }
    } else {
        echo "Error 1"; 
    }
} catch(SoapFault $ex) {
    echo 'Error: ';
    if ($ex->getMessage() != '') {
        echo $ex->getMessage();
    } else {
        echo $ex . "\n";
    }
}
?>

Hizmet:

<?php
//----------------------------------//
// This file is a dummy service It obviously does nothing with the data, but i needed it to build my client scripts and so it might give you a hand returning the correct strings.
//----------------------------------//

// Pull in the NuSOAP code
require_once('nusoap/nusoap.php');
// Create the server instance
$server = new soap_server();
// Initialize WSDL support
$server->configureWSDL('WDSL', 'urn:WDSL');
// Register the methods to expose
$server->register('handshake',              // method name
    array('id' => 'xsd:string', 
          'key' => 'xsd:string',
          'hash' => 'xsd:string'),          
    array('return' => 'xsd:string'),        // output parameters
    'urn:WDSL',                             // namespace
    'urn:WDSL#_handshake',                  // soapaction
    'rpc',                                  // style
    'encoded',                              // use
    'Initial handshake'                     // documentation
);
$server->register('authlogin',              // method name
    array('id' => 'xsd:string',             // User ID
          'email' => 'xsd:string',          // User email address
          'fname' => 'xsd:string',          // User first name
          'lname' => 'xsd:string',          // User last name
          'phone' => 'xsd:string',          // User phone
          'fax' => 'xsd:string',            // User fax 
          'dept' => 'xsd:string',           // SB department
          'role' => 'xsd:string'),          // SB role  
    array('return' => 'xsd:string'),        // output parameters
    'urn:WDSL',                             // namespace
    'urn:WDSL#authlogin',                   // soapaction
    'rpc',                                  // style
    'encoded',                              // use
    'Authentication of a user'              // documentation
);
// Define the method as a PHP function
function slidebank_handshake($uid, $key, $hash) {
    //returns the same hash string for confirmation. No need to pass UID again.
    $hashgenerator = $key . "xyz" . $uid . "randomstringhere";  
    $hash = sha1($hashgenerator);
    return $hash;
}
// Define the method as a PHP function
function slidebank_authlogin($id, $email, $fname, $lname, $phone, $fax, $dept, $role) {
    //logic to log user in and capture details etc
    return 'ok'; //options = ok or fail
}
// Use the request to (try to) invoke the service
$HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : '';
$server->service($HTTP_RAW_POST_DATA);
?>