2012-10-17 2 views
0

Savon은 WSDL에서 SOAP 봉투를 생성하는 데 완고합니다. 그것은 부적절하게 그것을 고칠 방법이 없습니다. 어떤 이유로 든 모든 것에 wsdl: 네임 스페이스를 삽입 할 자유가 있습니다.Savon :: Model을 사용하여 기본 네임 스페이스를 설정할 수 있습니까?

내가 작성중인 요청은 tns: 네임 스페이스를 사용합니다. 나는 Savon :: 모델을 사용할 수 있도록 싶지만, 지금 내가해야 할 :

client.request :tns, :function_name do 
    soap.body = { params } 
end 

과 같이 대신에 :

super(params) 

모든 기능에 요청 블록을 만들기가 지루 , 나는 Savon이 자동으로 적절한 함수를 호출하는 대신 함수 이름을 정의해야한다. 지금 내 기능은 다음과 같습니다.

def foo 
    client.request :tns, :foo do 
    ... 
end 

"foo"는 두 번 우스꽝스럽게 보입니다. Savon :: Model을 확장 한 클래스의 모든 요청에 ​​대해 기본 네임 스페이스를 설정하는 방법이 있습니까?

답변

0

귀하의 질문을 이해할 수 있을지 잘 모르겠습니다. 기본 네임 스페이스를 설정하고 요청 본문을 함수에 랩핑하는 방법을 묻는 것으로 가정하므로 매번 요청 본문을 작성할 필요가 없습니다. 이 코드는 저에게 효과적이지만 일부 관련없는 부분을 제거했습니다.

class ExampleWS 
    EXAMPLE_WS_DEFAULT_NAMESPACE = "urn:example:request:1.0.0" 
    ...... 
    def getStockPrice(locale, stockId) 
    response = $client.request :get_stock_price do 
    soap.input = [ 
     "ns1:getStockPrice", 
     { 
     "xmlns:ns1" => EXAMPLE_WS_DEFAULT_NAMESPACE #set default namespace here 
     } 
    ] 
    soap.body = { 
     "locale" => locale, 
     "stockId" => stockId 
    } 
    end 
    end 
    ...... 
end 
...... 
# call the function 
getStockPrice("en_US", 123) 
0

이 코드는 저에게 적합합니다. 그래도, Savon이 사용

class Soapservice 
    extend Savon::Model 

    client wsdl: "http://example.com?wsdl", env_namespace: :tns, 

    operations :get_resource, :put_resource 

    def :get_resource(id) 
    super(message: { id: id }) 
    end 
end 

service = Soapservice.new 
response = service.get_resource(1) #overwriting get_resource 
# or 
response = service.put_resource(message: { username: "luke", secret: "secret" }) 

미래 질문자가 자신의 문제에 적용 할 수 있도록

0
client = Savon.client do 
    wsdl "blah blah" 
    element_form_default :qualified 
    namespace_identifier :tem 
    env_namespace :soapenv 
end 
+1

이 당신의 대답에 약간의 설명을 추가하십시오 (내 예를 공식 savon homepage에서 일을 기반으로). – Brody

관련 문제