2013-10-31 4 views
6

파이썬 2.7에서 SOAPpy를 사용하여 SOAP 요청을 사용하여 메소드를 호출하려고합니다. 이 메서드는 GetCursOnDate이라고하며 환율을 반환합니다. 날짜 매개 변수가 필요합니다.SOAPpy를 사용하여 SOAP 요청을하는 방법은 무엇입니까?

나는 다음과 같은 코드를 사용하고 있습니다 :

from SOAPpy import SOAPProxy 
import datetime 

date=datetime.datetime.now() 
namespace ="http://web.cbr.ru/" 
url = "http://www.cbr.ru/DailyInfoWebServ/DailyInfo.asmx" 
server = SOAPProxy(url,namespace) 
print (date) 
server.GetCursOnDate(date) 

을하지만 난 다시 오류 얻을 :이 오류가 이유는 무엇입니까

Fault soap:Client: Server did not recognize the value of HTTP Header SOAPAction: GetCursOnDate.

를?

답변

12

기본적으로 SOAPpy는 메서드 이름을 HTTP SOAPAction 헤더의 값으로 사용합니다. 다음 코드를 실행하면 디버그 출력의 값이 표시됩니다

from SOAPpy import SOAPProxy 
from datetime import datetime 

input = datetime.now() 
namespace = "http://web.cbr.ru/" 
url = "http://www.cbr.ru/DailyInfoWebServ/DailyInfo.asmx" 

proxy = SOAPProxy(url, namespace) 
proxy.config.debug = 1 
proxy.GetCursOnDate(input) 

을 디버그이 보여줍니다

*** Outgoing HTTP headers *************************** 
POST /DailyInfoWebServ/DailyInfo.asmx HTTP/1.0 
Host: www.cbr.ru 
User-agent: SOAPpy 0.12.5 (http://pywebsvcs.sf.net) 
Content-type: text/xml; charset=UTF-8 
Content-length: 406 
SOAPAction: "GetCursOnDate" 
***************************************************** 

그러나 서비스는 사용자가 설정할 수있는 다른 값 (http://web.cbr.ru/GetCursOnDate을) 기대 프록시에 추가 매개 변수를 추가하십시오. 다음 코드는 오류를 지 웁니다 디버그 지금이 표시됩니다

from SOAPpy import SOAPProxy 
from datetime import datetime 

input = datetime.now() 
namespace = "http://web.cbr.ru/" 
url = "http://www.cbr.ru/DailyInfoWebServ/DailyInfo.asmx" 
soapaction = "http://web.cbr.ru/GetCursOnDate" 

proxy = SOAPProxy(url, namespace = namespace, soapaction = soapaction) 
proxy.config.debug = 1 
proxy.GetCursOnDate(input) 

:

*** Outgoing HTTP headers *************************** 
POST /DailyInfoWebServ/DailyInfo.asmx HTTP/1.0 
Host: www.cbr.ru 
User-agent: SOAPpy 0.12.5 (http://pywebsvcs.sf.net) 
Content-type: text/xml; charset=UTF-8 
Content-length: 406 
SOAPAction: "http://web.cbr.ru/GetCursOnDate" 
***************************************************** 

그러나 특정 오류가 사라지고 있지만, 호출이 작동하지 않습니다

. 질문으로 돌아올 것이기 때문에 나는 메시지 교환을 남겨두고 속편을 직접 쓸 것입니다. 파이썬의 SOAP 지원 on another occasion에 대한 실망감을 언급했다. 이 게시물에 대해서는 나 자신에 대한 참조로 모든 세부 정보를 추가하고 다른 사용자에게 도움이되기를 바랍니다. 그래서 여기에 ...

SOAPpy는 기본적으로 호출에 정렬 된 매개 변수를 사용하기 때문에 호출이 작동하지 않습니다. 그들은 v1, v2, v3 등으로 불립니다 (자세한 내용은 SOAPpy 다운로드 파일 MethodParameterNaming.txt 참조). 귀하의 SOAP 메시지는 다음과 같이 표시됩니다이 특정 웹 서비스가 On_date하지 v1라는 이름의 매개 변수를 기대하고있다

<SOAP-ENV:Body> 
    <ns1:GetCursOnDate xmlns:ns1="http://web.cbr.ru/" SOAP-ENC:root="1"> 
     <v1> 
     </v1> 
    </ns1:GetCursOnDate> 
</SOAP-ENV:Body> 

. 당신은 명명 된 매개 변수를 사용하여 그것을 해결하기 위해 시도 할 수 있습니다 :

from SOAPpy import SOAPProxy 
from datetime import datetime 

input = datetime.now() 
namespace = "http://web.cbr.ru/" 
url = "http://www.cbr.ru/DailyInfoWebServ/DailyInfo.asmx" 
soapaction = "http://web.cbr.ru/GetCursOnDate" 

proxy = SOAPProxy(url, namespace = namespace, soapaction = soapaction) 
proxy.config.debug = 1 
proxy.GetCursOnDate(On_date = input) 

귀하의 메시지가 이제 다음과 같습니다

<SOAP-ENV:Body> 
    <ns1:GetCursOnDate xmlns:ns1="http://web.cbr.ru/" SOAP-ENC:root="1"> 
     <On_date> 
     </On_date> 
    </ns1:GetCursOnDate> 
</SOAP-ENV:Body> 

나는 프록시가 datetime 객체에 문제가 있기 때문에 날짜의 값이 누락 생각 . 나는이 메시지에 또 다른 문제가 있기 때문에 그 문제가 무엇인지 확인하지 않았다. 웹 서비스는 <ns1:On_date>이 아닌 <On_date>을 기대한다.

여기 SOAPpy에는 네임 스페이스와 관련된 몇 가지 문제가 있습니다. 원본 SOAPpy 소스 코드를 사용하면 네임 스페이스를 변경할 수 없습니다. 대부분의 파이썬의 SOAP 라이브러리에서는 코드를 조정하여 원하는 동작 만 얻을 수 있다고 생각합니다. 이는 내가 한 일입니다. 나는 네임 스페이스와 태그 접두어가 처리 된 곳의 SOAPBuilder.py 파일을 변경했다.원본 파일 here과 변경된 파일 here을 참조하십시오.

내가 찾고있는 결과
from SOAPpy import SOAPProxy 
from SOAPpy import Types 

namespace = "http://web.cbr.ru/" 
url = "http://www.cbr.ru/DailyInfoWebServ/DailyInfo.asmx" 
soapaction = "http://web.cbr.ru/GetCursOnDate" 
input = Types.dateType(name = (namespace, "On_date")) 

proxy = SOAPProxy(url, namespace = namespace, soapaction = soapaction) 
proxy.config.debug = 1 
proxy.GetCursOnDate(input) 

지금은 얻을 :

<SOAP-ENV:Body> 
    <ns1:GetCursOnDate xmlns:ns1="http://web.cbr.ru/" SOAP-ENC:root="1"> 
     <ns1:On_date xsi:type="xsd:date">2013-11-02Z</ns1:On_date> 
    </ns1:GetCursOnDate> 
</SOAP-ENV:Body> 

는 서버가 반환

이러한 변화는 나에게 메시지를 통해 세밀하게 제어에 대한 SOAPpy 유형을 사용할 수 있습니다 위 요청에 대한 데이터.

위의 코드조차도 개선 될 수 있습니다. 특정 작업 (예 : GetCursOnDate)에 대해 프록시에 SOAPAction을 설정합니다. 다른 작업과 함께 사용하려면 다른 프록시가 필요하거나이 프록시를 수정해야합니다. WSDL.Proxy을 사용하면 WSDL에서이를 자동으로 가져옵니다 (웹 서비스의 WSDL에서 메서드 이름, 네임 스페이스 및 을 파싱하는 SOAPProxy 래퍼를 제공함).

그러나이 경우 SOAPAction을 자동으로 처리하더라도 메서드의 네임 스페이스가 선택되지 않습니다. 그래서 WSDL.py 파일을 수정했습니다. 원본 버전은 here이고 변경된 파일은 here입니다. 새로운 클라이언트 코드는 이제 다음과 같습니다 : 나는 0.7.2 fpconst 파이썬 2.6.6, SOAPpy 0.12.5을 사용하고 0.4.3를 wstools 위의 예는

from SOAPpy import WSDL 
from SOAPpy import Types 

# you can download this and use it locally for better performance 
wsdl = "http://www.cbr.ru/DailyInfoWebServ/DailyInfo.asmx?wsdl" 
namespace = "http://web.cbr.ru/" 
input = Types.dateType(name = (namespace, "On_date")) 

proxy = WSDL.Proxy(wsdl, namespace = namespace) 
proxy.soapproxy.config.debug = 1 

proxy.GetCursOnDate(input) 

. 다른 사람들을 위해 YMMV는 버전 또는 특정 웹 서비스에 의존한다고 생각합니다. 결론적으로 말하자면, Google에서 검색을 수행하면 대부분의 사람들이 SOAP 클라이언트 대신 SOAPpy를 권장하지만입니다. 어쩌면 이것도 살펴볼 수 있습니다. 행운을 빕니다!

0

targetNamespace가 무시 된 것처럼 보이지만 작동 당 네임 스페이스를 설정하면 soappy로 잘 작동합니다. 당신이 대신 네임 스페이스를 사용해야 물론

<operation name="createCall"> 
<soap:operation soapAction=""/> 
    <input> 
     <soap:body use="literal" namespace="http://create.service/"/> 
    </input> 
    <output> 
     <soap:body use="literal" namespace="http://create.service/"/> 
    </output> 
</operation> 

http://create.service/

관련 문제