2011-01-06 3 views
1

어떤 이유인지 SourceGear은 설치시 문서화되지 않은 웹 서비스를 제공합니다. 그들은 실제로 웹 서비스가 다소 엉망이기 때문에 개발자에게 API를 사용하라고 요청하지만, 필자는이 API를 Perl 환경에서 사용할 수 없기 때문에이 경우 문제가된다. 그래서 나의 구체적인 경우에 대한 솔루션은 웹 서비스를 사용하는 것이다.SOAP :: Lite를 사용하여 SourceGear 웹 서비스에 액세스하려면 어떻게해야합니까?

이것은 문제가되지 않습니다. SOAP::Lite을 사용하여 나는 같은 방식으로 과거에 여러 웹 서비스에 연결했다. 그러나 SOAP 호출을 어디서 만들 수 있는지 알지 못한다면 문서화가 부족하다는 것이 큰 혼란입니다. XML을 가지고 어디에서 어떻게 호출 할 것인지 해독 할 수 있습니다. 실제 SOAP 천재가 나를 도와 줄 수 있다면 좋을 것입니다.

는 로그인 호출 예와 예상되는 반응이다 :

요청

POST /fortress/dragnetwebservice.asmx HTTP/1.1 
Host: velecloudserver 
Content-Type: text/xml; charset=utf-8 
Content-Length: length 
SOAPAction: "http://www.sourcegear.com/schemas/dragnet/LoginPlainText" 

<?xml version="1.0" encoding="utf-8"?> 
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soap:Body> 
    <LoginPlainText xmlns="http://www.sourcegear.com/schemas/dragnet"> 
     <strLogin>string</strLogin> 
     <strPassword>string</strPassword> 
    </LoginPlainText> 
    </soap:Body> 
</soap:Envelope> 

응답

HTTP/1.1 200 OK 
Content-Type: text/xml; charset=utf-8 
Content-Length: length 

<?xml version="1.0" encoding="utf-8"?> 
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soap:Body> 
    <LoginPlainTextResponse xmlns="http://www.sourcegear.com/schemas/dragnet"> 
     <LoginPlainTextResult>int</LoginPlainTextResult> 
     <strAuthTicket>string</strAuthTicket> 
    </LoginPlainTextResponse> 
    </soap:Body> 
</soap:Envelope> 

나는이 조립 할 수있는 방법을 찾고 있어요 어쩐지. 이것은 내 Perl 예제입니다 :

my $soap = SOAP::Lite -> uri ('http://velecloudserver/fortress/dragnetwebservice.asmx') -> proxy('http://velecloudserver/fortress/dragnetwebservice.asmx/LoginPlainText'); 
my $som = $soap->call('LoginPlainText', SOAP::Data->name('LoginPlainText')->value(
    \SOAP::Data->value([ 
     SOAP::Data->name('strLogin')->value('admin'), 
     SOAP::Data->name('strPassword')->value('Adm1234'), 
    ])) 
); 

어떤 팁 감사하겠습니다.

답변

0

wget/curl/lwp/등을 가리키면 시작됩니다. http://velecloudserver/fortress/dragnetwebservice.asmx?WSDL 으로 변경하고 WSDL 파일이 다시 생성되는지 확인하십시오.

그렇다면 SOAP :: Lite POD에 나열된 네 가지 유형과 비교하십시오. 귀하의 요청 예는 Docment/리터럴 형태처럼 보이는, 그래서 당신은 다음과 같이 쓰고 끝낼 수 있습니다 : 당신이 다시 WSDL을 얻지 않는 경우에

use SOAP::Lite; 
    my $soap = SOAP::Lite->new(file => 'http://velecloudserver/fortress/dragnetwebservice.asmx?WSDL'); 

    $soap->on_action(sub { "urn:dragnetservice#LoginPlainText" }); 
    $soap->autotype(0); 
    $soap->default_ns('urn:LoginPlainText'); 

    my $som = $soap->call("LoginPlainText", 
     SOAP::Data->name('strLogin')->value('admin'), 
     SOAP::Data->name('strPassword')->value('Adm1234'), 
); 

    die $som->fault->{ faultstring } if ($som->fault); 
    print $som->result, "\n"; 

, 내가 가진 생성자 호출을 교체하려고 할 것 :

my $soap = SOAP::Lite->new(proxy => 'http://velecloudserver/fortress/dragnetwebservice.asmx'); 

내가 SOAP :: Lite로 작업 한 마지막 때, 위와 비슷한 간단한 프로그램을 작성하고 디버거에서 실행했습니다. $ soap-> call() 줄을 실행하기 전에 $ soap 객체의 내용을 엿보고 요청 페이로드를보고 soapUI.org Java 클라이언트를 사용하여 XML이 작동하는지 확인했습니다.

나는 두 번 POD를 읽어야했고, default_ns()와 같은 일부 메소드가 생성 된 XML에 어떤 영향을 미치는지 알아보기 위해 소스를 파헤 쳤다. 일단 내가 그것을하면, 그것은 모두 훨씬 더 의미가 있습니다.

참고 : SOAP :: Lite는 실패 할 때 죽는 것을 좋아합니다(). 프로덕션 사용을 위해 eval {}에 전화를 겁니다.

+0

프록시 방식이 올바르게 작동하는 것으로 변합니다. 서비스에서 LoginPlainTextResult와 null 값으로 1002를 반환하기 때문에 몇 가지 문제가 있습니다. strAuthTicket에 대한 null 값은 여전히 ​​무엇을 의미하는지 모르지만 적어도 회신을 받았습니다. – user565793

관련 문제