php中的SOAP不会返回MySql

时间:2016-06-15 21:16:31

标签: c# php mysql soap

我目前正在开发一个用PHP和MySQL开发的WebService 我在C#和WPF中开发的应用程序正在使用这些服务。

我的SOAP服务器使用PDO来访问数据库记录 的问题
当我尝试从我的应用程序访问web服务时,我没有得到数据库的结果 以下是我的C#应用程序尝试检索某些信息的示例:

bool result;
try
{
    PADR_API.PADR_APIWSClient client = new PADR_API.PADR_APIWSClient();
    string friends = client.GetFirendsList(8);        
}
catch (Exception ex)
{
    string i = ex.Message;//excuse this attempt but I am desperate to find the cause
    throw;
}
return result;  

然而,我在回复中得到的只是我的测试信息 以下是我的SOAP服务器的PHP代码:

public function GetFirendsList($id){
    $response = new getFreindsListResponse();
    $response->return = 'test of a message with following ';
    $response->return .= 'friends: ';
    $pdo = new PDO('mysql:host=localhost;dbname=****', $user, $pwd);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $stmt = $pdo->prepare("SELECT id,friends FROM PADR_users WHERE id = :id");
    $stmt->bindValue(':id', $id, PDO::PARAM_INT);
    $stmt->execute();
//        foreach ($stmt as $row) {
//            $response->return .= $row['friends'];
//        }
    while ($row = $stmt->fetch()) {
        $response->return .= $row['friends'];
    }
    //$response->return = var_dump($stmt);
    //$response->return = $pdo->errorInfo()[0];
    //$response->return = $res;
    return $response;
}

以下是我如何设置SOAP服务器的代码:

$options=array('cache_wsdl'=> WSDL_CACHE_NONE);
//create a new SOAP server
$server = new SoapServer('PADRAPIWS.wsdl', $options);//,$options
//attach the API class to the SOAP Server
$server->setClass('PADR_APIWS');
//start the SOAP requests handler
$server->handle();

我还尝试使用PHP SOAPClient

$options = array(//'location' => 'http://localhost/index.php', 
            'uri' => 'http://localhost/',
            'trace' => 1, 
            'exceptions' => true, 
            'cache_wsdl' => WSDL_CACHE_NONE, 
            'features' => SOAP_SINGLE_ELEMENT_ARRAYS);
$client = new SoapClient('http://padr.orgfree.com/index.php?wsdl', $options);
$client->__setLocation('http://padr.orgfree.com/index.php');
//var_dump($client);
var_dump($client->__getFunctions());
var_dump($client->__getTypes());
$res = $client->GetFirendsList(array('Id'=> 8));
var_dump($res);

真正有趣的是,当我在没有SOAP的php文件中使用我的代码时,查询返回结果很好。只要我想通过SOAP做到这一点,我就会回来test of a message with following friends: 我对PHP的经验很少,说实话我不知道故障在哪里?我一直关注有关creating the SOAP with WSDLPHP documentation的几个教程 然而,最后一个没有提供任何关于这个问题的见解,说实话我不知道如何描述这个问题,因为我不知道它在哪里。
附:这是客户的结果:

  

array(5){[0] => string(65)“GetFirendsListResponse GetFirendsList(GetFirendsList $ parameters)”[1] => string(68)“UpdateIPAddressResponse UpdateIPAddress(UpdateIPAddress $ parameters)”[2] => string(74)“CheckIfRegisteredResponse CheckIfRegistered(CheckIfRegistered $ parameters)”[3] => string(47)“RegisterResponse Register(Register $ parameters)”[4] => string(50)“AddFriendResponse AddFriend(AddFriend $ parameters)”} array(10){[0] => string(53)“struct AddFriend {string nickname; int friendId;}”[1] => string(45)“struct AddFriendResponse {boolean return;}”[2] => string(34)“struct GetFirendsList {int Id;}”[3] => string(49)“struct GetFirendsListResponse {string return;}”[4] => string(46)“struct CheckIfRegistered {string nickname;}”[5] => string(53)“struct CheckIfRegisteredResponse {boolean return;}”[6] => string(63)“struct UpdateIPAddress {string nickname; string ipaddress;}”[7] => string(51)“struct UpdateIPAddressResponse {boolean return;}”[8] => string(56)“struct Register {string nickname; string ipaddress;}”[9] => string(44)“struct RegisterResponse {boolean return;}”} object(stdClass)#2(1){[“return”] => string(42)“测试以下朋友的消息:”}

1 个答案:

答案 0 :(得分:0)

问题的最终答案是SOAP WS使用SOAP Envelope将消息从客户端传输到服务器 所以有用的是 $request = array('Id' => array('Value'=> 21)); $res = $client->GetFirendsList($request);
其中wsdl方法如下所示:

<message name="GetFirendsList">
    <part name="parameters" element="tns:GetFirendsList"/>
</message>
<message name="GetFirendsListResponse">
    <part name="parameters" element="tns:GetFirendsListResponse"/>
</message>
<operation name="GetFirendsList">
  <input wsam:Action="http://wsdl.example.org/PADR_APIWS/GetFirendsListRequest" message="tns:GetFirendsList"/>
  <output wsam:Action="http://wsdl.example.org/PADR_APIWS/GetFirendsListResponse" message="tns:GetFirendsListResponse"/>
</operation>
<operation name="GetFirendsList">
  <soap:operation soapAction=""/>
  <input>
    <soap:body use="literal"/>
  </input>
  <output>
    <soap:body use="literal"/>
  </output>
</operation>  

和xsd文件:

<xs:complexType name="getFirendsList">
<xs:sequence>
  <xs:element name="Value" type="xs:int"/>
</xs:sequence>

抱歉广泛的xml 这是C#代码:

PADR_API.getFirendsList request = new PADR_API.getFirendsList();
request.Value = 8;
client.GetFirendsList(request);  

这一切现在都有效 的结论
因此从中吸取的教训是,即使您只想发送int或任何其他原始类型,您也需要将其封装在一个对象中,然后将其视为SOAP信封。
SOAP服务器需要一个响应类型,必须在服务器端定义,如下所示:

class getGetFirendsListResponse {
    public $return;
}