Tôi muốn truy vấn một số nội dung thông qua SOAP bằng cách tạo WSDL với NuSOAP.
Tôi biết có rất nhiều câu hỏi liên quan đến chủ đề này, nhưng tôi đã không thành công trong việc điều chỉnh mã cho vấn đề cụ thể của mình.Tạo WSDL với NuSOAP - trả về cấu trúc với các loại khác nhau (int, string, array of structs)
Tôi đã thành công trong việc tạo mã WSDL chỉ trả về một mảng cấu trúc (mảng kết hợp), NHƯNG Tôi muốn trả về một đối tượng (struct) có chứa biến số nguyên, biến chuỗi VÀ mảng cấu trúc.
Vì vậy, đây là đoạn code mà làm việc cho trả lại một mảng của cấu trúc:
<?php
function getStuffs($user='', $pass='') {
// here we can check user and pass and do whatever (if it isn't alright, we can throw exception or return NULL or sg. similar)
// .......
$stuff_array = array();
$stuff_array[] = array('id'=>122, 'name'=>'One stuff');
$stuff_array[] = array('id'=>213, 'name'=>'Another stuff');
$stuff_array[] = array('id'=>435, 'name'=>'Whatever stuff');
$stuff_array[] = array('id'=>65, 'name'=>'Cool Stuff');
$stuff_array[] = array('id'=>92, 'name'=>'Wow, what a stuff');
return $stuff_array;
}
require_once 'nusoap/lib/nusoap.php';
$server = new soap_server;
// $myNamespace = $_SERVER['SCRIPT_URI'];
$myNamespace = 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['SCRIPT_NAME'];
$server->configureWSDL('MyStuffService', 'urn:' . $myNamespace);
// $server->wsdl->schemaTargetNamespace = 'http://soapinterop.org/xsd/';
$server->wsdl->addComplexType(
// name
'Stuffs',
// typeClass (complexType|simpleType|attribute)
'complexType',
// phpType: currently supported are array and struct (php assoc array)
'struct',
// compositor (all|sequence|choice)
'all',
// restrictionBase namespace:name (http://schemas.xmlsoap.org/soap/encoding/:Array)
'',
// elements = array (name = array(name=>'',type=>''))
array(
'id' => array(
'name' => 'id',
'type' => 'xsd:int'
),
'name' => array(
'name' => 'name',
'type' => 'xsd:string'
)
)
);
$server->wsdl->addComplexType(
// name
'StuffsArray',
// typeClass (complexType|simpleType|attribute)
'complexType',
// phpType: currently supported are array and struct (php assoc array)
'array',
// compositor (all|sequence|choice)
'',
// restrictionBase namespace:name (http://schemas.xmlsoap.org/soap/encoding/:Array)
'SOAP-ENC:Array',
// elements = array (name = array(name=>'',type=>''))
array(),
// attrs
array(
array(
'ref' => 'SOAP-ENC:arrayType',
'wsdl:arrayType' => 'tns:Stuffs[]'
)
),
// arrayType: namespace:name (http://www.w3.org/2001/XMLSchema:string)
'tns:Stuffs'
);
$server->register(
// string $name the name of the PHP function, class.method or class..method
'getStuffs',
// array $in assoc array of input values: key = param name, value = param type
array(
'user' => 'xsd:string',
'pass' => 'xsd:string'
),
// array $out assoc array of output values: key = param name, value = param type
array(
'return' => 'tns:StuffsArray'
),
// mixed $namespace the element namespace for the method or false
'urn:' . $myNamespace,
// mixed $soapaction the soapaction for the method or false
'urn:' . $myNamespace . "#getStuffs",
// mixed $style optional (rpc|document) or false Note: when 'document' is specified, parameter and return wrappers are created for you automatically
'rpc',
// mixed $use optional (encoded|literal) or false
'encoded',
// string $documentation optional Description to include in WSDL
'Fetch array of Stuffs ("id", "name").' // documentation
);
#$server->wsdl->schemaTargetNamespace = $myNamespace;
$server->service(isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : '');
exit();
?>
Trong C# Console Application, sau khi thêm một Web Reference gọi là "StuffService" với biểu tượng "? Wsdl" nối vào URL thích hợp nơi này PHP-tập tin có thể được tìm thấy, mã này làm việc, tôi hoàn toàn có thể truy vấn các giá trị stuff_array như thế này:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace WebServiceTest
{
class Program
{
static void Main(string[] args)
{
StuffService.MyStuffService myService = new StuffService.MyStuffService();
StuffService.Stuffs[] stuffs = myService.getStuffs("someone", "1234");
foreach (var stuff in stuffs)
{
Console.WriteLine(stuff.id+".: "+stuff.name);
}
Console.WriteLine();
Console.WriteLine("Press a key...");
Console.ReadKey();
}
}
}
Đó là mát mẻ, nhưng tôi muốn để phát triển mã này để trả lại một đối tượng như thế này:
class ResponseObject {
public $responseCode = 0;
public $responseMessage = '';
public $stuffArray = NULL;
}
$responseObject = NULL;
function getStuffs($user='', $pass='') {
global $responseObject;
$responseObject = new ResponseObject();
// check stuffs in a simple way now
if($user != 'someone' && $pass != '1234'){
$responseObject->responseCode = 2;
$responseObject->responseMessage = 'Authentication failed';
return $responseObject;
}
$responseObject->stuffArray = array();
$responseObject->stuffArray[] = array('id'=>122, 'name'=>'One stuff');
$responseObject->stuffArray[] = array('id'=>213, 'name'=>'Another stuff');
$responseObject->stuffArray[] = array('id'=>435, 'name'=>'Whatever stuff');
$responseObject->stuffArray[] = array('id'=>65, 'name'=>'Cool Stuff');
$responseObject->stuffArray[] = array('id'=>92, 'name'=>'Wow, what a stuff');
$responseObject->responseCode = 1;
$responseObject->responseMessage = 'Successful!';
return $responseObject;
}
mã NuSOAP thích hợp là gì cho điều đó?
Cảm ơn !! :)
Tôi hy vọng tôi có thể làm rõ những gì tôi muốn đạt được: trả về cấu trúc chứa int, chuỗi và mảng cấu trúc, nhưng không biết cách viết mã NuSOAP thích hợp cho điều đó. Bằng cách này, trước hết tôi có thể kiểm tra mã phản hồi và xử lý nó bằng các thông báo lỗi thích hợp HOẶC xuất ra nội dungArray, v.v.