0x00 서문
최근에 인터페이스를 작성해 왔습니다. 이전에는 json 또는 xml 형식을 사용하여 인터페이스 데이터 전송을 가져오거나 했습니다. 하지만 이번에는 제3자와 공동으로 디버깅할 때 wsdl 형식을 제공했습니다. 순식간에 SB로 변신...
Google에서 테스트 코드를 검색하면 테스트에서 타사 인터페이스를 호출하여 상태 200을 반환합니다. 아무 일도 일어나지 않으면 끝나는 줄 알았는데, 가까이 다가가보니 그들의 인터페이스를 아무리 호출해도 올바른 데이터가 반환되지 않는다는 것을 알게 되었습니다. 나중에 로그를 확인한 후 그들은 전달된 매개 변수를 전혀 받지 못했다는 사실을 발견했습니다. 그들은 문제를 해결하기 전까지 오후부터 저녁까지 혼란스러워했습니다. 꽤 흥미로울 것 같아 먼저 적어봤습니다.
0x01 wsdl이란 무엇인가요?
지금까지 말한 바에 따르면 Web Server의 정의를 기술하기 위해 사용되는 xml 형식의 문서, 즉 Web Server 방식입니다. 및 매개변수 설명.
참조: http://baike.baidu.com/link?url=R7x3FdekxbndR4SlzQLZE_2m1ebpt_SWt9IMjoHSErvLlbZ3-hwhR3ERrinXS1xZaDvkYFpxWnUchrk34_WkZq
http://api.testcn/x를 요청하는 경우. 웹 서비스/testServer?wsdl ' , 이렇게 URL이 ?wsdl로 끝나면 XML 구조의 데이터 묶음이 제공됩니다.
그렇습니다 그냥 덩어리입니다...
다음은 어떻게 이해하고 어떻게 말하는지가 관건이고 나머지는 다 안됨 .
0x02 설명 문서 이해하기
이 xml 문서를 처음 봤을 때 꽤 헷갈렸는데, PHP 확장을 사용하고 나니 훨씬 더 명확해졌습니다.
<?php $client = new SoapClient('http://api.test.cn/xwebservices/testServer?wsdl'); print "\n提供的方法\n"; print_r($client->__getFunctions()); print "相关的数据结构\n"; print_r($client->__getTypes()); print "\n\n";
여기서 SOAP 확장을 사용합니다. 이 확장은 공식 PHP 카피에서 제공되는 작업 처리 WebServer 서비스 확장입니다. 매개변수 전송을 구현하십시오.
위 그림에서 알 수 있듯이 이 인터페이스는 세 가지 방법, 즉
xxxxUserInfo
xxxxResumeNum
다운로드**
<을 제공합니다. 🎜>관련 데이터 구조는 메소드의 매개변수 이름과 매개변수 유형을 나타냅니다. 예를 들어 xxxxUserInfo 메서드에는 세 가지 문자열 유형 매개 변수가 필요합니다. 각각 in0, in1 및 in2에 해당합니다. 참고여기서 매개변수 키는 배열이 필요하지 않은 임의의 매개변수 이름인 in0이어야 하며, 사용자가 정의하거나 양 당사자가 합의한 것입니다. 인터페이스 메소드 작성을 시작하면서 err_msg(오류 정보 표시), err_code(오류 코딩 표시), 날짜(최종 데이터 전송) 등 인터페이스 사본에 제공된 매개변수 설명을 기반으로 전송을 수행했습니다. 그런 다음 정렬된 배열로 변경하고 해당 매개변수를 하나씩 입력합니다. 이때 키는 0~2입니다. 그러나 시도한 후에도 여전히 작동하지 않았습니다. 마지막으로 시도해 볼 마음으로 int0을 키 이름으로 사용하고 해당 err_msg 콘텐츠를 값으로 사용해 보았습니다. 좋아요~, 완벽한 솔루션입니다. 코드:<?php /** * @author 0x584A * 获取WSDL接口数据 */ class getwsdlTest extends PHPUnit_Framework_TestCase { public $apiurl = 'http://api.test.cn/xwebservices/testServer?wsdl'; private static $soapClientHandler; private $infoArr = [ 'err_msg' => 'false', 'err_code' => '0', 'date' => '此处是要传输的数据' ]; public function setUp() { $client = new SoapClient('http://api.test.cn/xwebservices/testServer?wsdl'); print "提供的方法\n"; print_r($client->__getFunctions()); print "相关的数据结构\n"; print_r($client->__getTypes()); print "\n\n"; } /** * xxxxUserInfo方法 */ public function testxxxxUserInfoData() { try { $ApiInfo = $this->infoArr; //set request param $parameter = array( 'in0' => $ApiInfo['err_msg'], 'in1' => $ApiInfo['err_code'], 'in2' => $ApiInfo['date'] ); $result = $this->getSoapClientHandler()->synchUserInfo($parameter); //调用结果返回异常 if (!$result instanceof stdClass) { throw new Exception("调用synchUserInfo结果出现异常:" . json_encode($result)); } //调用接口状态码,输出对应错误详情 if ($result->out == '01') { throw new Exception("调用synchUserInfo=>error:" . $result->out . ",msg:接口数据异常"); } $xml_parser = xml_parser_create(); if (!xml_parse($xml_parser, $result->out, true)) { xml_parser_free($xml_parser); throw new Exception("调用synchUserInfo返回的不是一个xml结构体"); } xml_parser_free($xml_parser); //XXE libxml_disable_entity_loader(true); $xml = simplexml_load_string($result->out, 'SimpleXMLElement', LIBXML_NOCDATA); // 输出参数 var_dump($xml->data); echo " 成功".PHP_EOL; } catch (SoapFault $soapFault) { throw new Exception($soapFault->getMessage() . $this->getSoapClientHandler()->__getLastResponse()); } } /** * @description getSoapClientHandler */ public function getSoapClientHandler() { if (!self::$soapClientHandler) { self::$soapClientHandler = new SoapClient($this->getSynchApi()); } return self::$soapClientHandler; } /** * @description getSynchApi */ public function getSynchApi() { return $this->apiurl; } } ?>