Webservice SOAP 请求 - 发送的数据类型错误

时间:2023-02-11
本文介绍了Webservice SOAP 请求 - 发送的数据类型错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

问题描述

上下文/我想要的:

我在使用 SOAP 调用 Web 服务时遇到问题.这是我想调用的 WS 的相关部分的图像:

(我自愿隐藏命名空间部分,这里不相关)

我想通过 'Demande_de_mot_de_passe' 函数发送数据并从这个请求中获取结果.

在下面的代码中,这个请求是正确的(函数的名字好),我猜问题是我要发送的数据的格式.函数的调用是用这部分进行的:

$client->Demande_de_mot_de_passe($soapVar);

我尝试过的:

这是我尝试过的代码的相关部分(我自愿更改数据的值,但没有其他任何内容.括号没有拼写错误,它关闭了函数和我没有放在这里的类以保留相关部分):

 $client = new SoapClient('URL_OF_THE_WS?WSDL', array('跟踪' =>1、'编码' =>'UTF-8','soap_version' =>SOAP_1_1,'类图' =>数组('Demande_de_mot_de_passe_Input' => 'Demande_de_mot_de_passe_Input')));$donnesUtilisateur = 新的 Demande_de_mot_de_passe_Input;$donnesUtilisateur->Code_societe = '000';$donnesUtilisateur->Ident_type = 'A';$donnesUtilisateur->Ident_code = 'xxxxxx';$donnesUtilisateur->Dat_demande = '00000000';$donnesUtilisateur->Adr_mail = 'xxxxxx';$donnesUtilisateur->Adr_cpos = 'xxxxxx';$donnesUtilisateur->Nom = 'xxxxxx';$donnesUtilisateur->Prenom = 'xxxxxx';$donnesUtilisateur->Dat_naiss = '00000000';$namespace = 'URL_OF_NAMESPACE';$soapVar = new SoapVar($donnesUtilisateur, SOAP_ENC_OBJECT,'Demande_de_mot_de_passe_Input', $namespace);$result = $client->Demande_de_mot_de_passe($soapVar);打印_r($result);}}类 Demande_de_mot_de_passe_Input {公共 $Code_societe;公共 $Ident_type;公共 $Ident_code;公开 $Dat_demande;公共 $Adr_cpos;公共 $Adr_mail;公共 $Nom;公开 $Prenom;公开 $Dat_naiss;}

我也试过用这样的数组传递一个对象的数组(没有成功):

$donnesUtilisateur = ['Code_societe' =>'000','Ident_type' =>'一个','Ident_code' =>'xxxxxx','Dat_demande' =>'00000000','Adr_cpos' =>'xxxxxx','Adr_mail' =>'xxxxxx','Nom' =>'xxxxxx','Prenom' =>'xxxxxx','Dat_naiss' =>'00000000',];

和:

$donnesUtilisateur = (对象) ['Code_societe' =>'000','Ident_type' =>'一个','Ident_code' =>'xxxxxx','Dat_demande' =>'00000000','Adr_cpos' =>'xxxxxx','Adr_mail' =>'xxxxxx','Nom' =>'xxxxxx','Prenom' =>'xxxxxx','Dat_naiss' =>'00000000',];

我得到的错误:

SoapFault:未收到Demande_de_mot_de_passe_Input"对象.在 SoapClient->__call() 中

如果我不明白,发送的数据格式不正确,但是当我尝试其他方式发送时,它仍然报告同样的错误.

我读过的文档没有成功:

(抱歉,帖子太长了,我希望它足够清楚,如果需要,不要忘记询问精度,在此先感谢您的帮助:))

解决方案

在您的 WSDL 类型中,有一个名为 Demande_de_mot_de_passe 的序列,它使用名为 Demande_de_mot_de_passeRequest 的元素而不是 <代码>Demande_de_mot_de_passe_Input.

来自 SoapUI 的打印描述了消息请求,但如果它是 document 样式,则 Demande_de_mot_de_passe 是一种类型.另一方面,如果它是 RPC 是方法名称.

如果是 RPC,您可以按如下所示进行启动.您应该尽可能使用本机对象(SOAP 会更好地使用它们).stdObject 就足够了:

$request = new stdClass();$ demande_de_mot_de_passeRequest->Code_societe = '000';$ demande_de_mot_de_passeRequest->Ident_type = 'A';$ demande_de_mot_de_passeRequest->Ident_code = 'xxxxxx';$ demande_de_mot_de_passeRequest->Dat_demande = '00000000';$ demande_de_mot_de_passeRequest->Adr_mail = 'xxxxxx';$ demande_de_mot_de_passeRequest->Adr_cpos = 'xxxxxx';$ demande_de_mot_de_passeRequest->Nom = 'xxxxxx';$ demande_de_mot_de_passeRequest->Prenom = 'xxxxxx';$ demande_de_mot_de_passeRequest->Dat_naiss = '00000000';$request->Demande_de_mot_de_passeRequest = $ demande_de_mot_de_passeRequest;$response = $client->Demande_de_mot_de_passe($request);

如果您的 SOAP 绑定是文档,您只需添加一个名为 Demande_de_mot_de_passe

的新上层

/** 变量 $demande_de_mot_de_passeRequest 如上创建 **/$ demande_de_mot_de_passe = new stdClass();$ demande_de_mot_de_passe->Demande_de_mot_de_passeRequest = $ demande_de_mot_de_passeRequest;$request->Demande_de_mot_de_passe = $ demande_de_mot_de_passe;$response = $client->Demande_de_mot_de_passe($request);

您的 WSDL 不需要列表/集合(这不是您的情况),因此您不需要使用 SoapVar 创建/解析变量.您可以阅读其他示例(一个是我的,但它是葡萄牙语),另一个是关于 BOGUS 节点的:

http://forum.imasters.com.br/topic/535213-enviar-xml-via-soap/?p=2137411http://www.fischco.org/blog/2011/3/26/php-soapserver-objects-arrays-and-encoding.html

Context / What I want :

I'm facing an issue while calling a Webservice with SOAP. Here's an image the relevant part of the WS I want to call :

(I voluntarily hide the namespace part, not relevant here)

I want to send data through 'Demande_de_mot_de_passe' function and catch result from this request.

In the code below, this request is correct (the name of the function is good), I guess the problem is the formatting of the data I want to send. The call of the function is made with this part :

$client->Demande_de_mot_de_passe($soapVar);

What I've tried :

Here's the relevant part of the code I've tried ( I voluntarily change values of data but nothing else. There is no typo error with the brackets, it close the function and the class I didn't put here to keep the relevant part) :

    $client = new SoapClient('URL_OF_THE_WS?WSDL', array(
      'trace'        => 1,
      'encoding'     => 'UTF-8',
      'soap_version' => SOAP_1_1,
      'classmap'     => array('Demande_de_mot_de_passe_Input' => 'Demande_de_mot_de_passe_Input')
    ));

    $donnesUtilisateur = new Demande_de_mot_de_passe_Input;
    $donnesUtilisateur->Code_societe = '000';
    $donnesUtilisateur->Ident_type   = 'A';
    $donnesUtilisateur->Ident_code   = 'xxxxxx';
    $donnesUtilisateur->Dat_demande  = '00000000';
    $donnesUtilisateur->Adr_mail     = 'xxxxxx';
    $donnesUtilisateur->Adr_cpos     = 'xxxxxx';
    $donnesUtilisateur->Nom          = 'xxxxxx';
    $donnesUtilisateur->Prenom       = 'xxxxxx';
    $donnesUtilisateur->Dat_naiss    = '00000000';
    $namespace = 'URL_OF_NAMESPACE';

    $soapVar = new SoapVar($donnesUtilisateur, SOAP_ENC_OBJECT,'Demande_de_mot_de_passe_Input', $namespace);

    $result = $client->Demande_de_mot_de_passe($soapVar);

    print_r($result);

  }
}

class Demande_de_mot_de_passe_Input {
  public $Code_societe;
  public $Ident_type;
  public $Ident_code;
  public $Dat_demande;
  public $Adr_cpos;
  public $Adr_mail;
  public $Nom;
  public $Prenom;
  public $Dat_naiss;
}

I've also tried with passing array of casting an object with the array like this (without success) :

$donnesUtilisateur =  [
      'Code_societe' => '000',
      'Ident_type'  => 'A',
      'Ident_code'  => 'xxxxxx',
      'Dat_demande' => '00000000',
      'Adr_cpos'    => 'xxxxxx',
      'Adr_mail'    => 'xxxxxx',
      'Nom'         => 'xxxxxx',
      'Prenom'      => 'xxxxxx',
      'Dat_naiss'   => '00000000',
    ];

and :

$donnesUtilisateur = (object) [
      'Code_societe' => '000',
      'Ident_type'  => 'A',
      'Ident_code'  => 'xxxxxx',
      'Dat_demande' => '00000000',
      'Adr_cpos'    => 'xxxxxx',
      'Adr_mail'    => 'xxxxxx',
      'Nom'         => 'xxxxxx',
      'Prenom'      => 'xxxxxx',
      'Dat_naiss'   => '00000000',
    ];

Error I get :

SoapFault: Did not receive a 'Demande_de_mot_de_passe_Input' object. in SoapClient->__call()

If I unterstand clearly, the formatting of data sent is not correct but when I try other way to send it, it still reporting the same error.

Docs I've read about without success :

http://www.fvue.nl/wiki/Php:_Soap:_How_to_add_attribute_to_SoapVar

http://grokbase.com/t/php/php-soap/066jkmcz2h/passing-objects-to-soap-server-complextype-classmap

EDIT

Here's a capture of the WS 'Demande_de_mot_de_passe' function call in SoapUI :

(Sorry for the long post, I hope it is clear enough, don't forget to ask about precisions if needed, thanks in advance for your help :) )

解决方案

At your WSDL's type, there's a sequence named Demande_de_mot_de_passe which use a element named Demande_de_mot_de_passeRequest and not Demande_de_mot_de_passe_Input.

Your print from SoapUI describe the message request, but if it's document style, Demande_de_mot_de_passe is a type. On the other hand if it's RPC is the method name.

Starting if it's RPC you can do as showed below. You should use as native object as you can (SOAP will work better with they). A stdObject will be good enough:

$request = new stdClass();

$demande_de_mot_de_passeRequest->Code_societe = '000';
$demande_de_mot_de_passeRequest->Ident_type = 'A';
$demande_de_mot_de_passeRequest->Ident_code = 'xxxxxx';
$demande_de_mot_de_passeRequest->Dat_demande = '00000000';
$demande_de_mot_de_passeRequest->Adr_mail = 'xxxxxx';
$demande_de_mot_de_passeRequest->Adr_cpos = 'xxxxxx';
$demande_de_mot_de_passeRequest->Nom = 'xxxxxx';
$demande_de_mot_de_passeRequest->Prenom = 'xxxxxx';
$demande_de_mot_de_passeRequest->Dat_naiss = '00000000';

$request->Demande_de_mot_de_passeRequest = $demande_de_mot_de_passeRequest;

$response = $client->Demande_de_mot_de_passe($request);

If your SOAP binding is document, you just have to add a new upper level named Demande_de_mot_de_passe

/** The variable $demande_de_mot_de_passeRequest is created as above **/

$demande_de_mot_de_passe = new stdClass();
$demande_de_mot_de_passe->Demande_de_mot_de_passeRequest = $demande_de_mot_de_passeRequest;
$request->Demande_de_mot_de_passe = $demande_de_mot_de_passe;

$response = $client->Demande_de_mot_de_passe($request);

Your WSDL doesn't need a list/collections (it's not your case), so you don't need to create/parse variables with SoapVar. There's others examples that you can read about (one is mine, but it's in portuguese) and other is about the BOGUS node:

http://forum.imasters.com.br/topic/535213-enviar-xml-via-soap/?p=2137411 http://www.fischco.org/blog/2011/3/26/php-soapserver-objects-arrays-and-encoding.html

这篇关于Webservice SOAP 请求 - 发送的数据类型错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

上一篇:如何从 php soap 客户端调用重载的 wsdl webservice 方法 下一篇:如何在 CentOS 上启用 SOAP

相关文章

最新文章