2009-05-01 40 views
6

Tôi không có kinh nghiệm tương đối với SOAP. Tôi đang cố gắng làm việc với một webservice cho một khách hàng sử dụng chế độ WSDL. Tôi gặp sự cố khi truyền tham số với phương thức và khiến họ đến các tham số để hiển thị trong yêu cầu khi cần. Tôi đang sử dụng lớp xà phòng php chuẩn.Các tham số phương thức truyền qua xà phòng PHP

tôi cần yêu cầu SOAP của tôi được cấu trúc như sau:

<?xml version="1.0" encoding="UTF-8"?> 
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://hostserver/"> 
    <SOAP-ENV:Body> 
     <ns1:DoLogin> 
      <ns1:request> 
       <ns1:Session> 
        <ns1:SessionId>00000000-0000-0000-0000-000000000000</ns1:SessionId> 
       </ns1:Session> 
       <ns1:UserCredential> 
        <ns1:UserName>username</ns1:UserName> 
        <ns1:Password>password</ns1:Password> 
        <ns1:ApplicationID>00000000-0000-0000-0000-000000000000</ns1:ApplicationID> 
        <ns1:ClientID>00000000-0000-0000-0000-000000000000</ns1:ClientID> 
        <ns1:ClientVersion>V1.0</ns1:ClientVersion> 
       </ns1:UserCredential> 
      </ns1:request> 
     </ns1:DoLogin> 
    </SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

Trong php Tôi gọi hàm như sau:

$client->DoLogin($args); 

Và yêu cầu kết thúc như thế này:

<?xml version="1.0" encoding="UTF-8"?> 
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://hostserver/"><SOAP-ENV:Body><ns1:DoLogin/></SOAP-ENV:Body></SOAP-ENV:Envelope> 

Không có vấn đề làm thế nào tôi vượt qua args (varabiables đơn, mảng, đối tượng lớp) Tôi không thể nhận được yêu cầu có cấu trúc như thế.

Có ai có thể giúp tôi không? Tôi chắc chắn rằng nó sẽ là một cái gì đó khá đơn giản.

+0

Bạn đã tìm thấy câu trả lời chưa? – darpet

Trả lời

-3

thử này,

$client->__soapCall('methodName',array('requestObj'=>$requestObj)); 
10

Trong khi làm việc trên một vấn đề liên quan một chút ngày hôm nay, tôi thấy rằng PHP sau đây được sản xuất theo yêu cầu SOAP hiển thị dưới đây:

$sc = new SoapClient($url); 
$params = array('step' => 'ShippingInfo', 'value' => "hello"); 
$result = $sc->__soapCall('runStep', array('parameters' => $params)); 
<?xml version="1.0" encoding="UTF-8"?> 
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://tempuri.org/"> 
<SOAP-ENV:Body> 
    <ns1:runStep> 
    <ns1:step>ShippingInfo</ns1:step> 
    <ns1:value>hello</ns1:value> 
    </ns1:runStep> 
</SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

Một bắt Tôi thấy rằng nếu các tham số ($ params) tôi đã thông qua không phù hợp với những gì đã được chỉ định trong tệp WSDL, thông báo rằng máy khách SOAP nerated sẽ trông giống như những gì bạn khiếu nại - một thông điệp với một cơ thể không chứa giá trị dữ liệu. Tôi tự hỏi nếu vấn đề của bạn nằm ở đây.

Ngoài ra, lưu ý cách PHP ở trên sử dụng hai mảng để chuyển tham số. Mảng đầu tiên chứa các tham số và tên của chúng. Thứ hai chứa mảng đầu tiên. Cú pháp thú vị, tôi biết. :-)

FYI, mã ví dụ trên được sử dụng để giao tiếp với một dịch vụ C# Net WCF có hợp đồng sau đây:

[OperationContract] 
string runStep(string step, string value); 
+0

Xin lỗi vì đã nhận xét một chuỗi cũ, nhưng việc này sẽ tạo '$ params' làm mảng khi thực hiện cuộc gọi hàm làm việc cho tôi. Cảm ơn Ben. – etm124

+0

Trên thực tế bạn chỉ có thể vượt qua một mảng mảng: mảng ($ params) và nó sẽ làm việc giống nhau. – nikita2206

+0

Bạn đã cứu mạng sống của tôi ngay bây giờ Ben Gribaudo :) $ sc-> FuncName (mảng ("param" => "value)) đang truyền tham số như mong đợi nhưng $ sc -> __ soapCall (" FuncName ", mảng (" param "= > "giá trị") không phải là đi qua bất kỳ tham số.Đặt các tham số vào mảng ("tham số" => $ tham số) đã làm các trick.Thanks rất nhiều dude. – sajushko

3

thử điều này:

$soapClient->__soapCall('methodToCall', array('parameters' => $yourParamsArray)); 

Đó làm việc cho tôi bằng dịch vụ web .NET.

0

Tôi đã gặp vấn đề tương tự.

này một giải quyết cho tôi:

$result = $soapClient->somefunction(array( "param1" => "value1", "param2" => "value2" ));

loại Parameter (và trật tự) phải giống như những gì các wsdl hiện định nghĩa. (String, đối tượng, vv)

1
This is valid way: right mr.bgondy 
$result = $soapClient->methodsomefunction("params1"=>"value","params2"=>"value2"); 

câu hỏi của tôi là bạn nói

$soapClient->__soapCall('methodToCall', array('parameters' => $yourParamsArray)); 

trên mã cho các dịch vụ web .net nhưng khi tôi đã thử phương pháp này cho.net asp dịch vụ web, các thông số giá trị không phân tích cú pháp tôi nghĩ như vậy bởi vì khi tôi gỡ bỏ params = giá trị không có hiệu lực tương tự "Lỗi không xác định xảy ra!" từ các dịch vụ web .net asp trong iframe.

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