2009-04-01 35 views
6

Tôi đang cố truy cập WebService bằng nuSOAP (vì tôi bị ràng buộc với PHP4 ở đây) sử dụng nhiều hơn 1 vùng tên trong thư. Điều đó có thể không?Cách sử dụng nuSOAP cho các thư có nhiều không gian tên

Một ví dụ yêu cầu nhắn sẽ trông như thế này:

<soapenv:Envelope ... 
    xmlns:ns1="http://domain.tld/namespace1" 
    xmlns:ns2="http://domain.tld/namespace2"> 
    <soapenv:Header/> 
    <soapenv:Body> 
    <ns1:myOperation> 
     <ns2:Person> 
     <ns2:Firstname>..</ns2:Firstname> 
     .. 
     </ns2:Person> 
     <ns1:Attribute>..</ns1:Attribute> 
    </ns1:myOperation> 
    </soapenv:Body> 
</soapenv:Envelope> 

Tôi cố gắng để sau:

$client = new nusoap_client("my.wsdl", true); 
$params = array(
    'Person' => array(
    'FirstName' => 'Thomas', 
    .. 
    ), 
    'Attribute' => 'foo' 
); 

$result = $client->call('myOperation', $params, '', 'soapAction'); 

với hy vọng rằng nuSOAP sẽ cố gắng để phù hợp với các tên này để các không gian tên chính xác và các nút. Sau đó, tôi cố gắng sử dụng soapval() để tạo ra các yếu tố và không gian tên của họ - nhưng nếu tôi gọi một hoạt động, nuSOAP tạo theo yêu cầu sau:

<SOAP-ENV:Envelope ...> 
    <SOAP-ENV:Body> 
    <queryCCApplicationDataRequest xmlns="http://domain.tld/namespace1"/> 
    </SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

Vì vậy, họ gặp khó khăn trong giai đoạn "phù hợp".

Trả lời

5

Sau khi thử xung quanh với các khớp, tôi thấy hai giải pháp khả thi:

1) Không sử dụng WSDL để tạo ra các nusoap_client và soapval() để tạo thông điệp này có nhược điểm là thông điệp chứa rất nhiều chi phí (không gian tên được định nghĩa trong mỗi phần tử). Không ổn.

2) Thay vì dựa vào kết hợp các thông số, hãy tạo câu trả lời của bạn bằng xml và đặt tất cả định nghĩa cho tiền tố trong phần tử đầu tiên - ví dụ:

$params = "<ns1:myOperation xmlns:ns1="..." xmlns:ns2="..."> 
     <ns2:Person> 
     <ns2:Firstname>..</ns2:Firstname> 
     .. 
     </ns2:Person> 
     <ns1:Attribute>..</ns1:Attribute> 
    </ns1:myOperation>"; 

Tuy nhiên không phải là một giải pháp rất tốt đẹp, nhưng nó hoạt động :-)

+0

Tôi vừa thử giải pháp của bạn và nó hoạt động .... cảm ơn người đàn ông. –

0

Vâng, tôi đã có vấn đề này cùng (tìm thấy q của bạn thông qua google!) Và tôi đã đi qua này: http://www.heidisoft.com/blog/using-nusoap-consume-net-web-service-10-min Tại đây, nhà phát triển tạo ra nội dung xml của thư trong coe và sau đó sử dụng nusoap để gửi.

+0

Hmm, có vẻ như liên kết hiện không hoạt động. Từ những gì bạn nói, có vẻ như họ theo một cách tiếp cận tương tự (tạo xml "thủ công"), phải không? – wilth

4

Xây dựng trên bài đăng của Irwin, tôi đã tạo xml theo cách thủ công và có nusoap làm phần còn lại. Webhost của tôi không có phần mở rộng xà phòng php, vì vậy tôi phải đi với nusoap và dịch vụ web tôi đang cố gắng tiêu thụ các không gian tên trên mỗi thẻ (ví dụ: tên người dùng và mật khẩu trong ví dụ của tôi ở đây).

require_once('lib/nusoap.php'); 

$client = new nusoap_client('https://service.somesite.com/ClientService.asmx'); 
$client->soap_defencoding = 'utf-8'; 
$client->useHTTPPersistentConnection(); // Uses http 1.1 instead of 1.0 
$soapaction = "https://service.somesite.com/GetFoods"; 

$request_xml = '<?xml version="1.0" encoding="utf-8" ?> 
<env:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"> 
    <env:Body> 
    <n1:GetFoods xmlns:n1="https://service.somesite.com"> 
     <n1:username>banjer</n1:username> 
     <n1:password>theleftorium</n1:password> 
    </n1:GetFoods> 
    </env:Body> 
</env:Envelope> 
'; 

$response = $client->send($request_xml, $soapaction, ''); 

echo '<h2>Request</h2><pre>' . htmlspecialchars($client->request, ENT_QUOTES) . '</pre>'; 
echo '<h2>Response</h2><pre>' . htmlspecialchars($client->response, ENT_QUOTES) . '</pre>'; 
echo '<h2>Debug</h2><pre>' . htmlspecialchars($client->getDebug(), ENT_QUOTES) . '</pre>'; 

Sau đó, tôi đã có một lỗi mà nói:

Notice: Undefined property: nusoap_client::$operation in ./lib/nusoap.php on line 7674 

Vì vậy, tôi đã đi con đường lười biếng và đi vào nusoap.php và thêm mã này trước khi dòng 7674 để làm cho nó hạnh phúc:

if(empty($this->operation)) { 
     $this->operation = ""; 
    } 
+0

Sau khi cọ rửa internet trong nhiều ngày, đây là điều duy nhất giúp tôi tìm ra nó. Cảm ơn bạn! Tôi đã không nhận được lỗi đó nhưng tôi phải đặt $ client-> endpoint = ''; – Cypher909

1

Bỏ qua khác vấn đề này sẽ là sửa đổi đối với hàm nusoap_client :: call(). Bên cạnh dòng này (7359 trong phiên bản 1,123) trong nusoap.php:

$nsPrefix = $this->wsdl->getPrefixFromNamespace($namespace);

tôi thêm này một:

$nsPrefix = $this->wsdl->getPrefixFromNamespace("other_ns_name"); 

Và nó làm việc! Vì tôi chỉ cần thư viện này cho một dự án, nên tôi có thể mã hóa bản hack này. Nếu không, tôi sẽ khai thác nhiều hơn và sửa đổi hàm để chấp nhận mảng thay vì chuỗi cho một tham số không gian tên.

Các vấn đề liên quan