2009-08-20 29 views
9

Các bạn, tôi bị kẹt, đập đầu khỏi bàn trong vài giờ qua.SOAP-ERROR: Mã hóa: Vi phạm các quy tắc mã hóa?

Tôi đang cố gắng tiêu thụ một dịch vụ và tôi có 8 chức năng khác mà tôi gọi gần giống với ID này nhưng kết quả là 'SOAP-ERROR: Encoding: Violation of encoding rules' lỗi.

Heres gọi hàm (wsdl bỏ qua đối với an ninh):

function CanLoadProduct($data){ 

    $client = new SoapClient('wsdl-url'); 

    $params = array('username' => $this->username, 
        'password' => $this->password, 
        'prod'  => $data['productid'], 
        'mdn'  => $data['mdn']); 

    try { 
     $reply = $client->__soapCall("CanLoadProduct", $params); 
    } catch (Exception $e) { 
     echo 'Error: ', $e->getMessage(), "\n"; 
     print_r($params); 
     die(); 
    } 

    if($reply['result'] == 1){ 
     return TRUE;  // 1 = true 
    } else { 
     return FALSE; 
    } 

} 

Ok như vậy chức năng này, kết nối với một webservice, các yếu tố cần thiết là: username, password, prod, MDN, tất cả 4 trong số đó Tôi cung cấp như là một phần của mảng $ params. Tên người dùng/Mật khẩu được xác định trước đó và hoạt động tốt, vì 8 hàm khác sử dụng dịch vụ web mà không gặp bất kỳ sự cố nào.

Mảng $ data [] (mà tôi chuyển đến hàm), chứa: $ data ['productid'] $ data ['mdn'] không có gì khác được sử dụng.

Tôi nhận

SOAP-ERROR: Encoding: Violation of encoding rules 

vì một lý do không giải thích được, và Googling lỗi này được tôi đâu. Bất cứ ai khác chạy vào điều này? Chạy PHP 5.2.9-2. Điều kỳ lạ là đây là giống với chức năng này mà hoạt động 100%:

function GetPIN($productid){ 

    $client = new SoapClient('wsdl-url'); 

    $params = array('username' => $this->username, 
        'password' => $this->password, 
        'prod'  => $productid); 

    try { 
     $reply = $client->__soapCall("GetPIN", $params); 
    } catch (Exception $e) { 
     echo 'Error: ', $e->getMessage(), "\n"; 
     die(); 
    } 
     return $reply; 
} 

Đây là WSDL (nên đăng này đầu tiên):

<?xml version="1.0" encoding="ISO-8859-1"?> 
<definitions xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" 
    xmlns:tns="ready:test" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" 
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
    xmlns="http://schemas.xmlsoap.org/wsdl/" targetNamespace="ready:test"> 
<types> 
<xsd:schema targetNamespace="ready:test" 
> 
<xsd:import namespace="http://schemas.xmlsoap.org/soap/encoding/" /> 
<xsd:import namespace="http://schemas.xmlsoap.org/wsdl/" /> 
</xsd:schema> 
</types> 
<message name="CanLoadProductRequest"> 
    <part name="username" type="xsd:string" /> 
    <part name="password" type="xsd:string" /> 
    <part name="prod" type="xsd:string" />  
    <part name="mdn" type="xsd:string" /> 
    <part name="esn" type="xsd:string" /></message> 
<message name="CanLoadProductResponse"> 
    <part name="result" type="xsd:int" /></message> 
<portType name="CanLoadProductPortType"> 
    <operation name="CanLoadProduct"> 
    <input message="tns:CanLoadProductRequest"/> 
    <output message="tns:CanLoadProductResponse"/> 
    </operation> 
</portType> 

<binding name="CanLoadProductBinding" type="tns:CanLoadProductPortType"> 
    <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/> 
    <operation name="CanLoadProduct"> 
    <soap:operation soapAction="{url-removed}" style="rpc"/> 
    <input> 
     <soap:body use="encoded" namespace="" 
      encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/> 
    </input> 
    <output> 
     <soap:body use="encoded" namespace="" 
      encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/> 
    </output> 
    </operation> 
</binding> 
<service name="CanLoadProduct"> 
    <port name="CanLoadProductPort" binding="tns:CanLoadProductBinding"> 

    <soap:address location="{url-removed}"/> 
    </port> 
</service> 
</definitions> 
+2

Nếu đây là khách hàng .NET, tôi sẽ cố gắng mã hóa "prod" và "mdn" mã hóa cứng để được biết các giá trị tốt và xem điều gì xảy ra. Nếu nó hoạt động, tôi sẽ loại bỏ một mã cứng tại một thời điểm để xem cái nào là vấn đề. Sau đó tôi sẽ xem xét giá trị thất bại để xem có điều gì đặc biệt về nó hay không. –

+0

Đó cũng là suy nghĩ đầu tiên của tôi. –

+0

Tôi đã cố gắng mã hóa nó, nhưng tôi nhận được kết quả tương tự, nó rất lạ. Tôi không biết về bất kỳ phương pháp nào khác của sự cố khi chụp ảnh này. – Jakub

Trả lời

14

Dường như bạn có một loại không phù hợp ở đâu đó , hoặc trong khi lắp ráp yêu cầu của bạn (một trong các tham số không phải là chuỗi kiểu), hoặc máy chủ trả về một cái gì đó khác với int (vi phạm định nghĩa phản hồi WSDL và do đó khiến máy khách xem xét phản hồi không hợp lệ, vì nó mong đợi một thứ khác) .

  • Để kiểm tra các trường hợp đầu tiên, đảm bảo đúc tất cả các thông số để chuỗi đầu tiên
  • Để kiểm tra trường hợp thứ hai, tạo SoapClient của bạn với dấu vết tùy chọn thiết lập là true để đạt được quyền truy cập vào các câu trả lời XML thực tế từ máy chủ qua $ client -> __ getLastResponse() sau đó (Bạn có thể sử dụng điều này để gỡ lỗi yêu cầu cũng thông qua __getLastRequest()).

Một số quan sát thêm/câu hỏi:

  • Theo WSDL được đăng, các 'CanLoadProductRequest' có một param thứ năm 'ESN', mà bạn không cung cấp trong cuộc gọi chức năng của bạn.
  • Bất kỳ lý do nào bạn sử dụng $client->__soapCall("CanLoadProduct", $params) thay vì $client->CanLoadProduct($username, $password, etc.)? (Phiên bản đầu tiên là biến thể cấp thấp hơn được dự định để sử dụng cho các trường hợp non_WSDL. Phiên bản thứ hai có thể cung cấp cho bạn lỗi/ngoại lệ chi tiết hơn)
  • Bạn có thể kiểm tra lệnh SOAP để tảiLưới sản phẩm theo một số phương tiện khác không? Lỗi có thể ở phía máy chủ, cố gắng trả về kiểu kết quả không phù hợp với định nghĩa WSDL.
+0

'esn' là tùy chọn và mẫu dữ liệu người dùng/pass/prod/mdn/esn này là tiêu chuẩn cho hầu hết 8 cuộc gọi khác mà tôi sử dụng, dường như không có lỗi nào ngoại trừ cái này. Tôi đã thử $ client-> CanLoadProduct ($ params), nhưng kết quả là: Mảng thành chuỗi chuyển đổi Thông báo từ PHP – Jakub

+0

Oups - xin lỗi, nếu bạn sử dụng ký hiệu $ client-> CanLoadProduct(), bạn không vượt qua mảng tham số, nhưng các thông số đơn như bạn làm với một hàm gọi tiêu chuẩn (ví dụ $ client-> CanLoadProduct ($ username, $ password, vv)) ) –

+1

Một thứ khác để thử sẽ rõ ràng là đưa các tham số vào chuỗi trước cuộc gọi (ví dụ: productid có thể được chuyển thành int) –

2

Tôi đã gặp vấn đề tương tự khi cố gắng chuyển XML dưới dạng tham số cho một trong các dịch vụ web của tôi.Việc gói dữ liệu XML vào số <![CDATA[ ... ]]> đã loại bỏ SOAP-ERROR: Mã hóa: Vi phạm các quy tắc mã hóa và mọi thứ hoạt động tốt.

Chi tiết khác:
1. Tham số cũng được định nghĩa là xsd: string.
2. WSDL là tài liệu/chữ.
3. Sử dụng được xây dựng trong lớp SOAP với php 5.2.10.

2

Tôi đã nhận được lỗi này bằng cách sử dụng công cụ SoapUI, cho đến khi tôi định dạng lại phản hồi với dữ liệu thử nghiệm thực và không chỉ '?'. Cũng với SoapUI, phản hồi có thể nhiều hơn mong đợi và có thể phải rút ngắn lại phản hồi mong đợi bằng cách loại bỏ một số tham số phản hồi tùy chọn. Hi vọng điêu nay co ich?

+0

Đây cũng là vấn đề của tôi. Nó đã được mong đợi một số nguyên được trả lại và rõ ràng? không phải là một int. –

+0

làm thế nào tôi có thể biết giá trị được mong đợi sẽ được trả về? –

1
<![CDATA[<?xml version="1.0" 
encoding="utf-8"?> 
<CONTENTXML></CONTENTXML]]></xmlCallString>]]> 
2

tôi đã cùng một vấn đề và tôi giải quyết sử dụng cú pháp này cho __soapCall:

... 
$params = new SoapParam($data, 'parameters'); 

$response = $this->__soapCall('methodName', 
    array(new SoapVar($data, XSD_ANYTYPE, 'parameters')) 
);   
... 

Thay vì

__soapCall('methodName', array($params) 
6

tôi đã cùng một vấn đề.

Trong sở thích soapUI Tôi đã kiểm tra các tùy chọn Preferences → Cài đặt → biên tập Validate Responses và tôi nhận được thông tin này:

line 3027: Invalid decimal value: unexpected char '44'.

này giải quyết vấn đề của tôi. Trường chứa giá trị loại sai.

+0

Điều này đã giúp tôi một tấn với gỡ lỗi wsdl của tôi. – Halfstop

+0

Tùy chọn nằm trong "Tệp" và bạn cũng có thể bật "Xác thực yêu cầu" để tìm hiểu xem bạn có đang gửi sai loại dữ liệu trong ví dụ thử nghiệm của mình hay không. – MatsLindh

0

Tôi đã gặp sự cố tương tự và đã cố khắc phục bằng cách sửa WSDL, giả sử máy chủ gửi một số nguyên cho một giá trị cụ thể, nhưng thực sự đang gửi một chuỗi. Có lẽ thay đổi WSDL từ:

<part name="result" type="xsd:int" /></message> 

để

<part name="result" type="xsd:string" /></message> 

Có thể giải quyết vấn đề của bạn, đây là một số thông tin về các trường hợp cụ thể tôi đã phải đối mặt với: https://blog.dotnetframework.org/2016/12/06/uncaught-soapfault-exception-sender-soap-error-encoding-violation-of-encoding-rules/

0

Tôi có vấn đề này trong PhpStorm khi làm bài kiểm tra đơn vị. Tôi đã tắt bộ nhớ cache wsdl và nó hoạt động: ini_set ("soap.wsdl_cache_enabled", "0");

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