2014-01-31 2 views
1

으로 전체 xml 메시지를 전달하는 방법 (현재 마스터 분기는 https://github.com/savonrb/savon입니다.) ,Savon v3.x - Savon 버전 3.x를 사용하여

해시에서
operation.body = { 
    Search: { 
    accountID: 23, 
    accountStatus: 'closed' 
    } 
} 

response = operation.call 

은 savon가 전체 SOAP 메시지 XML (봉투, 헤더를 생성합니다

는 현재 당신이 해시, 전으로 메시지의 본문을 정의 savon 3의 비누 요청을 생성합니다 etc ..) 그리고 그 메시지를 HttpClient에 전달하여 요청을 비누 끝점에 게시하십시오. '= my_xml_request_message ..... 더 많이 중첩 된 노드, 네임 스페이스를 대신 해시의

, 난 내 요청, 전으로 완전한 XML 메시지를 전달 할 수 있도록하고 싶습니다 등 속성의 톤 ..... '

body이 비누 요청을 만들 build로 전송 한 다음 call 게시 한 것 같습니다 :,536,https://github.com/savonrb/savon/blob/master/lib/savon/operation.rb#L79

def call 
    raw_response = @http.post(endpoint, http_headers, build) 
    Response.new(raw_response) 
end 

그래서 나는 원숭이 패치를 생각하고 있었습니까? call은 내 XML 블록, 전으로 build을 대체 할 수 있도록 :

def call 
    raw_response = @http.post(endpoint, http_headers, my_xml_request_message) 
    Response.new(raw_response) 
end 

우리가 갇히지있어 어디 그 - 내 XML을 만들거나 제대로 게시지고 있다면 나에게 분명하지 않다. 또는 이것이 올바른 방법 일 경우 ...

사전 도움에 감사드립니다!

+0

그래서 우리는 Savon에> 작업을 호출() 메소드를 재정 의하여 원숭이 패치를 내놓았다 raw_xml_message 데프 메시지 = (raw_xml_message 전화 = 0!?raw_xml_message : 빌드) 이 raw_response = @ http.post (엔드 포인트, HTTP_HEADERS, 메시지) Response.new (raw_response) 끝 끝 우리는 새로운 방법을 포함하고 있습니다 end''데프 우리의 프레임 워크에 raw_xml_message' 'def body '에 대한 것을 정의하고 싶지 않은 경우. – solidlight

+0

이 패치를 Savon 3 master에 추가해야합니까? 아니면 더 나은 해결책이 있습니까? – solidlight

답변

0

원숭이 패치가 우리의 문제를 해결했습니다. 지금은 좋은 답변이라고 생각합니다. 우리는 가능하면 savon 3 마스터를이 솔루션을 추가 찾고, 세부 사항 : https://github.com/savonrb/savon/issues/546

class Savon 
    class Operation 
    attr_accessor :raw_xml_envelope 

    def call 
     message = (raw_xml_envelope != nil ? raw_xml_envelope : build) 

     raw_response = @http.post(endpoint, http_headers, message) 
     Response.new(raw_response) 
    end 

    end 
end 

더 배경 : 우리는 대한 Savon를 사용하여 웹 서비스 (SOAP & REST) ​​테스트 프레임 워크를 구축했습니다

비누 백본. 우리의 프레임 워크에서 각 wsdl 연산을 설명하는 몇 가지 메서드를 정의합니다. 우리의 사용 사례는 xml 본문을 해시 (예 : savon의 example_body()에 설명 된대로)로 정의하거나 전달할 때 savon body() 메서드를 사용하도록 허용하는 것입니다. raw raw xml envelope - 원숭이 패치를 통해 위에서 raw_xml_envelope() 메소드를 사용하여 수행 할 수 있습니다. `클래스 Savon 클래스 운영 attr_accessor :

+0

수정 사항이 마스터로 가져 왔습니다. https://github.com/savonrb/savon/pull/548 – solidlight

0

Savon3은 아직 안정적이지 않기 때문에 아직 사용하지 않습니다. v2에서 할 수있는 작업은 다음과 같습니다.

client.call(:authenticate, xml: "<envelope><body></body></envelope>") 

v3에서도 비슷한 기능이 작동한다고 가정합니다. 그것은 v1과 v2에 존재했습니다.

+0

안녕. 답장을 보내 주셔서 감사합니다. 네, 그게 v2에서 작동하도록했습니다. savon이 다시 작성하는 방식을 좋아하기 때문에 v3을 사용하여 프레임 워크를 구축했습니다. 지금까지 모든 것이 잘 작동했지만 전체 XML을 전달하려고합니다. (불행히도 savon의 example_body 메소드는이 경우 body() 해시를 생성 할 수 없습니다). – solidlight