0x00 Preface
Recently the interface has been written, before which the interface data transfer is transmitted or obtained using JSON or XML format. But this time with third-party intermodulation, they were given the WSDL format. Instant seconds Change SB ...
Google to test with code, Test call third-party interface return status 200. I thought there was nothing to it. It's time to close, and then find out that no matter how they call them the interface is not the correct data echo. Then they looked over the log and found that the parameters they passed were not received, and the problem was solved by the afternoon until evening. I think it's interesting, so write it down first.
What is the 0x01 WSDL
To a certain degree, it is an XML-formatted document that describes the definition of Web server, that is, a Web server method and a parameter description.
See: Http://baike.baidu.com/link?url=R7x3FdekxbndR4SlzQLZE_2m1ebpt_SWt9IMjoHSErvLlbZ3-hwhR3ERrinXS1xZaDvkYFpxWnUchrk34_WkZq
When we ask for http://api.test.cn/xwebservices/testServer?wsdl ', similar to the end of the WSDL URL, a lump of XML structure data is given to you.
Yes, just a lump of ...
Next, how to understand it and what it means is the key, the others are useless.
0x02 Understanding the Description document
It's a bit confusing to start looking at this XML document, but it's a lot more obvious with PHP extensions.
__getfunctions ());p rint "related data structure \ n";p rint_r ($client->__gettypes ());p rint "\ n";
Here we use the SOAP extension, which is the PHP official copy to present the operation processing Webserver service extension, and finally we also through it to implement the parameter transmission.
As can be understood in the above image, this interface provides three methods, namely:
Xxxxuserinfo
Xxxxresumenum
download**
The relevant data organization refers to the parameter name in the method, and the parameter type. For example, a Xxxxuserinfo method requires three arguments of type string. corresponding to In0,in1 and in2 respectively.
Note
The argument key here must be in0, which is an arbitrary parameter name without an array, user-defined, or mutually agreed upon. At the beginning of the writing interface method, I was based on the parameters given in the interface copy such as: err_msg (for error message), Err_code (indicating the error code), date (the final data transmitted) to transmit. After changing to an ordered array, fill in the corresponding parameters, at this time key is 0 to 2. Can try after or there is no egg, finally wrapped in a try to try the mentality, try to int0 as the key name, the corresponding err_msg content as a value. ok~, perfect solution.
Code:
' false ', ' err_code ' = ' 0 ', ' date ' = ' Here is the data to be transferred ']; Public Function SetUp () {$client = new soapclient (' http://api.test.cn/xwebservices/testServer?wsdl '); Print "supplied method \ n"; Print_r ($client->__getfunctions ()); Print "Related data structure \ n"; Print_r ($client->__gettypes ()); print "\ n"; }/** * Xxxxuserinfo method */Public Function Testxxxxuserinfodata () {try {$ApiInfo = $th is->infoarr; Set request param $parameter = array (' in0 ' = = $ApiInfo [' err_msg '], ' in1 ' =& Gt $ApiInfo [' Err_code '], ' in2 ' = ' $ApiInfo [' Date ']; $result = $this->getsoapclienthandler ()->synchuserinfo ($parameter); The call result returns an exception if (! $result instanceof StdClass) {throw new Exception ("Call Synchuserinfo result exception:". Json_encode ($result)); }//Call interface status code, output corresponding error details if ($result->out = = ' ") {throw new Exception (" Call Synchuserinfo=>error: ". $result->out. ", msg: Interface Data Exception"); } $xml _parser = Xml_parser_create (); if (!xml_parse ($xml _parser, $result->out, True)) {Xml_parser_free ($xml _parser); throw new Exception ("Call Synchuserinfo returns not an XML struct"); } xml_parser_free ($xml _parser); XXE Libxml_disable_entity_loader (TRUE); $xml = simplexml_load_string ($result->out, ' simplexmlelement ', libxml_nocdata); Output parameter Var_dump ($xml->data); echo "Success". Php_eol; } catch (SoapFault $soapFault) {throw new Exception ($soapFault->getmessage (). $this->getsoapclienthandl ER ()->__getlastresponse ()); }}/** * @description Getsoapclienthandler */Public Function Getsoapclienthandler () {if (!se LF:: $soapClientHandler) {self:: $soapClientHandler = new SoapClient ($this->getsynchapi ()); } return Self:: $soapClientHandler; }/** * @description GETSYNCHAPI */Public Function Getsynchapi () {return $this->apiurl; }}?>