2010-11-19 4 views
2

여러분,SOAP PHP .NET 호출. 매개 변수 없음

PHP에서 SOAP 웹 서비스를 사용하여 .NET 웹 서비스를 호출하고 있습니다. 모든 매개 변수를 전달하는 시점까지 모든 괜찮은 멋쟁이. 원격 웹 서비스는 응답을 처리하는 listener.php 파일에 요청을합니다. 그러나 현재 매개 변수를 가져올 수없는 것 같습니다 ... 요청을 보내기 전에 확인하면 매개 변수가 표시되지 않습니다. XML로.

누군가 매개 변수를 전달하는 방법을 명확하게 보여줄 수 있습니까?

$pCriteria->AuctionID = new SoapVar($auction_id, XSD_INT, 'xsd:int');

나 :

$ar_bidupdate_params_total = array('AuctionID' => $auction_id,'parameter2... etc..)

나 :

$ar_bidupdate_params = array( new SoapParam($auction_id, 'AuctionID'),

을 지금까지 나는 다음과 같은 제한을 포함한 3 가지 방법을 볼 수 있지만 한 샘플 코드는 다양한 방식으로 호출되는 것을 보여줍니다 (ar 웹 ound).

$info = $soapClient->__call("BidUpdate", array($pCriteria));

또는

$info = $client->BidUpdate($pCriteria);

질문은, 1) 어떻게 기본 SoapClient를 사용하여 안정적으로 이러한 매개 변수를 전달하고, 2) 이렇게하는 가장 좋은 방법은 무엇입니까?

다른 방법으로 볼을 사용할 수없는 경우 XML을 즉시 만들 수도 있습니다. 이 방법을 선택하면 XML 문자열을 보내는 가장 좋은 방법은 무엇입니까?

답변

3

문제를 정당화하려면 다음을 수행하십시오. 예, SoapClient로 작업하면 실망 할 수 있습니다. 주로 문서 때문입니다. 여기에 당신을위한 샘플 코드가 있는데, 나는 잠깐 동안 프로젝트를 위해 일하고있다. 나는이 기술을 지불 게이트웨이를위한 라이브러리에서 사용하는 것을 끝내었다. 문자열 이름에서 dereferenced 함수 호출을 사용하여이 코드가 정확하지는 않지만 함수는 작동합니다. 당신이 (필요한 경우) WSDL 및 인증서를 설정 한 후

$method = "ACTION"; 
$wsdl = "WSDLFILE.wsdl"; 
$parameters = array (
    'location'    => "http://url.com", 
    'local_cert'   => "/full/path/to/CERTIFICATE.pem," 
    'passphrase'   => "TEST-PASSWORD", 
    'use'     => SOAP_ENCODED , 
    'connection_timeout' => 4, 
    'user_agent'   => null 
); 
$client = new SoapClient($wsdl, $parameters); 
$response = $client->{$method}($data); 
var_dump($response); 

는 WSDL, IE에서 무엇에 해당하는 다음 SoapClient이 기능을 비행합니다 ($ 방법)에 생성, 정교한하려면 다음 작업을 위해 "캡처()"또는 "권한 부여()"). 그런 다음 클라이언트는 XML 보내기/구문 분석을 처리합니다. SOAP_ENCODED 사용 여부에 관계없이 매개 변수를 전달하는 방법은 실제로 상대방의 내용에 따라 다릅니다.

나는 봉투 XML을 수동으로 생성하는 방법을 다루었지만 반대 의견을 제시했다. .NET 프로젝트가 자동으로 수행하고 문제가되어서는 안되는 좋은 WSDL 덤프를 얻는 한 수동으로 이동해야하는 것과는 대조적으로 변경/업데이트 될 경우 유지 관리의 악몽을 피하는 것이 좋습니다. XML 텍스트를 뒤 틀기.

+0

wsdl 파일을 캐시하여 작업 속도를 높이고 불필요한 순수 트래픽을 줄이는 것이 좋습니다. – zanlok

+0

PHP 사이트에 따르면 "__call"은 더 이상 사용되지 않으며 "__soapCall"은 비 -wsdl 모드에 대한 것입니다. 객체에서 메소드를 직접 호출 할 수 있으며,이를 참조하여 기본 comm 모듈에서 하드 코딩되지 않지만 사용자 정의 클래스 코드의 다른 위치에서 지정됩니다. http://www.php.net/manual/en/soapclient.soapcall.php – zanlok

0

1) 기본 SoapClient를 사용하여 이러한 매개 변수를 안정적으로 전달하는 방법 PHP는 디버깅 오류가 발생하지 않으므로 어렵습니다. 모든 호출을 테스트하여 타임 아웃이 올바르게 설정되었는지 확인하십시오 (PHP는 타임 아웃 오류시 false를 반환 함). 매개 변수가 올바른지 확인하십시오. 이를 안정적으로 수행 할 수있는 유일한 방법은 시스템에서 작동하는 것이 무엇인지를 알고 이러한 매개 변수 안에 있어야한다는 것입니다.다른 모든 옵션 (시간 제한, 자격 증명 등)을 확인하고 정말 견고한 것을 얻을 때까지 주변에서 놀아보십시오.

2)이 작업을 수행하는 가장 좋은 방법은 무엇입니까? 두 호출 모두 올바른 구문이며 매개 변수 구조가 실제로 그렇게 복잡하지는 않습니다. 먼저 어려운 부분을 먼저 처리하고 있습니다. 내 구조는 일반적으로 다음과 같습니다 : $ opts = array (... options ...); $ client = new SoapClient ('https : //URL/WebAPI/WebAPI.asmx? WSDL', $ opts);

$paramters = array('a_sUserID' => $un, 'a_sUserPass' => $pw, 'xmlBatch' => $createTicketXML); 

는 그런 전화 같은 :

$result = $client->call('GetAllMembers',$paramters); 

그리고 이것은 내가 성공적인 결과를 만들어 정상적인 루프 :

foreach ($result['GetMemberAllResult']['MemberData'] as $key => $value) 
{ 
    //code 
} 

가장 생각 날 수 있습니다 내가 얻을입니다 것은 SoapUI (http://www.soapui.org/)를 사용하여 모든 것을 설정 한 다음 모든 것을 PHP로 마이그레이션합니다. 거기에서 테스트를 실행하고 SOAP에서 만들어진 도구를 사용하여 통화에서 발생한 상황을 정확하게 파악할 수 있습니다.

0

그냥 우리 모두가 어떻게 됐는지 알게 해주고 싶습니다. 더 복잡한 유형이 정의되어 있기 때문에 문제가 발생했습니다. 따라서 개별 매개 변수로 함수를 입력하지 않았고, 클래스로 함수를 입력했습니다. 'classmap'이 정의되었을 때만 발생했습니다.

우리는 .NET을 통해 서비스를 사용하려고 할 때 뭔가 더 필요하다는 것을 깨달았습니다. - (MS가 Visual Studio에서 모든 것을 묶었습니다.) 여분의 클래스가 매개 변수로 전달 된 것이 분명해졌습니다. 우리가 WSDL을 좀 더 이해한다면 분명해졌습니다.

$classmap = array('UpdateInfo' => 'UpdateInfo'); 

$server = new SoapServer("domain.com/Listener.wsdl", array('classmap' => $classmap, 'soap_version' => SOAP_1_2, 'encoding' => 'UTF-8', 'uri' => 'http://tempuri.org/'));# 

매개 변수 배열은 정상적으로 전달됩니다. 도움이 필요하신 분은 두 분 모두에게 감사드립니다.

+0

대단히 환영합니다. 그리고 공유해 주셔서 감사합니다. 전반적으로, SOAP에 대한 나의 경험은 우리에게 일을 시작하는 번거 로움입니다. – zanlok

관련 문제