2013-08-24 1 views
0

SOAP 클라이언트로 처음으로 작업 했으므로 여기에서 잘못된 것을 잘 모릅니다. 여기 Ruby & Savon SOAP 클라이언트 - SOAP 작업을 찾을 수 없습니다.

내가 사용하지하기 위해 노력하고있어 SOAP API를이다 : http://services.carsolize.com/BookingServices/DynamicDataService.svc?wsdl

irb(main):018:0> client = Savon.client(wsdl: "http://services.carsolize.com/BookingServices/DynamicDataService.svc?wsdl", convert_request_keys_to: :camelcase) 

을 아무리 clientcall에 전달할 것, 그것은 나에게 말한다 :

irb(main):022:0> client.call :service_request, :message => {} 
HTTPI GET request to services.carsolize.com (net_http) 
Savon::UnknownOperationError: Unable to find SOAP operation: :service_request 
Operations provided by your service: [] 
    from /var/lib/gems/1.9.1/gems/savon-2.2.0/lib/savon/operation.rb:22:in `ensure_exists!' 
    from /var/lib/gems/1.9.1/gems/savon-2.2.0/lib/savon/operation.rb:14:in `create' 
    from /var/lib/gems/1.9.1/gems/savon-2.2.0/lib/savon/client.rb:32:in `operation' 
    from /var/lib/gems/1.9.1/gems/savon-2.2.0/lib/savon/client.rb:36:in `call' 
    from (irb):22 
    from /var/lib/gems/1.9.1/gems/railties-3.2.13/lib/rails/commands/console.rb:47:in `start' 
    from /var/lib/gems/1.9.1/gems/railties-3.2.13/lib/rails/commands/console.rb:8:in `start' 
    from /var/lib/gems/1.9.1/gems/railties-3.2.13/lib/rails/commands.rb:41:in `<top (required)>' 
    from script/rails:6:in `require' 
    from script/rails:6:in `<main>' 

가 이해 그 SOAP 서비스 어떤 작업도보고하지 않습니다. 이 주위에 어떤 방법이 있습니까? 그것은 내 편이 뭔가 망치고있는 것입니까, 아니면 웹 서비스입니까?

Savon 버전 : 2.2.0

+2

서비스를 조사하는 가장 좋은 방법은 SoapUI를 사용하고 작동하는 호출을 만드는 것입니다. 다음 단계는 동일한 요청을 생성하는 Ruby/Savon에 클라이언트를 작성하는 것입니다. –

답변

3

Savon의 2.x.x는 WSDL없이 웹 서비스에 액세스 할 수 있습니다. SoapUI와 함께 제공 한 WSDL을 검사하고 출력을 사용하여 다음 코드를 작성했습니다.

분명히 정확한 자격 증명이 없기 때문에 작동하지 않지만 계속 진행할 수 있어야합니다.

#!ruby 
# 
gem 'savon', '~> 2.0' 
require 'savon' 

client = Savon.client(
    endpoint: 'http://services.carsolize.com/BookingServices/DynamicDataService.svc', 
    soap_action: "http://tempuri.org/IDynamicDataService/ServiceRequest", 
    namespace: 'http://tempuri.org/', 
    convert_request_keys_to: :camelcase, 
    env_namespace: :soapenv, 
    namespace_identifier: :tem, 
    log: true, 
    log_level: :debug, 
    pretty_print_xml: true 
) 

response = client.call(:service_request, 
         message: { 
          'tem:rqst' => { 
          'BookAsUser' => 'nobody', 
          'Credentials' => { 
           'Password' => 'super secret', 
           'UserName' => 'JoeSixpack' 
          }, 
          'Request' => { 
           'ClientIP' => '192.168.142.857' 
          }, 
          'RequestType' => 'reservation', 
          'SessionID' => 'AAAAAAAAAAAAAABBBBBBBBBBBBB', 
          'TypeOfService' => 'speedy' 
          } 
         } 
        ) 
p response.to_hash 
+0

신난다, 나는 내일 이것을 시험해보고, 뒤로보고 할 것이다. 정말 고마워! – RFC1337

+0

유효한 자격증 명을 사용하여 해당 코드를 시도한 결과는 다음과 같습니다. Savon :: SOAPFault : (a : ActionNotSupported) 'ServiceRequest'동작이있는 메시지를 수신기에서 처리 할 수 ​​없습니다. C ontractFilter가 EndpointDispatcher. 이는 계약 불일치 (발신자와 수신자 간의 일치하지 않는 작업) 또는 발신자와 수신자 간의 바인딩/보안 불일치 때문일 수 있습니다. 발신자와 수신자가 동일한 계약 및 동일한 바인딩 (메시지, 전송, 없음과 같은 보안 요구 사항 포함)을 가지고 있는지 확인하십시오. – RFC1337

+0

다시 시도 : 네임 스페이스 정의에서 맞춤법 오류를 발견했습니다. 또한 SoapUI를 사용하여 사용자 지정 SOAPAction이 필요하다는 사실을 발견했습니다. 그에 따라 내 대답의 소스를 편집했습니다. 이제 환상의 RequestType이 알려지지 않았기 때문에 여전히 오류가 발생합니다. 서비스에 대한 설명을 포함하고 무엇을 넣을 지 알기를 바랍니다. –