0x00 서문
저는 최근에 인터페이스를 작성하고 있습니다. 이전에는 json 또는 xml 형식을 사용하여 인터페이스 데이터 전송을 가져오거나 했습니다. 하지만 이번에는 제3자와 공동으로 디버깅할 때 wsdl 형식을 제공했습니다. 순식간에 SB로 변경...
Google에서 테스트 코드를 검색하면 테스트에서 타사 인터페이스를 호출하여 상태 200을 반환합니다. 아무 일도 일어나지 않으면 끝날 줄 알았는데, 가까이 다가가 보니 인터페이스를 어떻게 호출해도 올바른 데이터가 에코되지 않는다는 것을 알게 되었습니다. 그런 다음 그들은 로그를 확인하고 전달된 매개변수를 전혀 받지 못했다는 사실을 발견했습니다. 그들은 문제를 해결하기 전까지 오후부터 저녁까지 혼란스러워했습니다. 꽤 흥미로울 것 같아 먼저 적어봤습니다.
0x01 wsdl이란 무엇인가
어떤 분 말씀대로라면 Web Server의 정의를 기술하는데 사용되는 XML 형식의 문서, 즉 Web Server 메소드와 매개변수 설명입니다.
참조: https://www.php.cn/faq/437443.html
http://api.test.cn/xwebservices/testServer?wsdl'을 요청하면 어떻게 끝나나요? wsdl의 URL을 설정하면 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; } } ?>
홍보: "PHP Tutorial"
위 내용은 PHP는 wsdl을 어떻게 처리합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!