sábado, 11 de março de 2017

ricardoduarte.net

Como acessar webservices SOAP com Python

Ricardo Duarte

Na semana passada estava precisando de uma biblioteca Python para realizar acesso a um web service SOAP. Fazendo uma rápida pesquisa encontrei algumas bibliotecas bem utilizadas, mas todas estavam muito desatualizadas, como a SOAPpy por exemplo, que não é atualizada desde 2005.

Quando já estava quase desistindo de encontrar algo atualizado que atendesse a minha necessidade, eu me deparo com essa biblioteca de nome suds. Fiquei positivamente surpreso ao encontrar uma biblioteca que além de ser atualizada e possuir uma boa documentação, representa toda a simplicidade e praticidade de Python.

suds

Como muitos sabem, o protocolo SOAP é um protocolo de comunicação complicado, mas usando o suds tudo fica muito simples. Vejam só.

Para o nosso exemplo, vamos usar um web service que traz informações sobre a Copa do Mundo (eu sei, estou meio atrasado, mas vá lá, é só um exemplo). O endereço do serviço é: http://footballpool.dataaccess.eu/data/info.wso?WSDL. Vamos agora usar o suds para acessar esse serviço.

:::python
from suds.client import Client

url = "http://footballpool.dataaccess.eu/data/info.wso?WSDL"

cliente = Client(url)

print cliente

Simples assim e temos o cliente que representa o serviço com informações sobre a Copa do Mundo carregado em memória. A última linha do código acima serve para listar os métodos que esse serviço disponibiliza. O resultado é esse:

:::bash
Suds ( https://fedorahosted.org/suds/ )  version: 0.3.9 GA  build: R659-20100219


Service ( Info ) tns="http://footballpool.dataaccess.eu"
   Prefixes (1)
      ns0 = "http://footballpool.dataaccess.eu"
   Ports (1):
      (InfoSoap)
         Methods (41):
            AllCards()
            AllDefenders(xs:string sCountryName, )
            AllForwards(xs:string sCountryName, )
            AllGames()
            AllGoalKeepers(xs:string sCountryName, )
            AllGroupCompetitors()
            AllMidFields(xs:string sCountryName, )
            AllPlayerNames(xs:boolean bSelected, )
            AllPlayersWithRedCards(xs:boolean bSortedByName, xs:boolean bSortedByRedCards, )
            AllPlayersWithYellowCards(xs:boolean bSortedByName, xs:boolean bSortedByYellowCards, )
            AllPlayersWithYellowOrRedCards(xs:boolean bSortedByName, xs:boolean bSortedByYellowCards, xs:boolean bSortedByRedCards, )
            AllStadiumInfo()
            Cities()
            Coaches()
            CountryNames(xs:boolean bWithCompetitors, )
            DateLastGroupGame()
            DateOfFirstGame()
            DateOfLastGame()
            FullTeamInfo(xs:string sTeamName, )
            GameInfo(xs:int iGameId, )
            GameResultCodes()
            GamesPerCity(xs:string sCityName, )
            GamesPlayed()
            GoalsScored(xs:int iGameId, )
            GroupCompetitors(xs:string sPoule, )
            GroupCount()
            Groups()
            NextGame()
            NumberOfGames()
            PlayedAtWorldCup(xs:string sTeamName, )
            RedCardsTotal()
            StadiumInfo(xs:string sStadiumName, )
            StadiumNames()
            StadiumURL(xs:string sStadiumName, )
            Teams()
            TeamsCompeteList()
            TopGoalScorers(xs:int iTopN, )
            TopSelectedGoalScorers(xs:int iTopN, )
            TournamentInfo()
            YellowAndRedCardsTotal()
            YellowCardsTotal()
         Types (38):
            ArrayOfString
            ArrayOftCardInfo
            ArrayOftCoaches
            ArrayOftCountryInfo
            ArrayOftCountrySelectedTopScorer
            ArrayOftGameCard
            ArrayOftGameInfo
            ArrayOftGameResultCode
            ArrayOftGoal
            ArrayOftGroupInfo
            ArrayOftGroupsCompetitors
            ArrayOftPlayerNames
            ArrayOftPlayersWithCards
            ArrayOftStadiumInfo
            ArrayOftTeamCompete
            ArrayOftTeamInfo
            ArrayOftTopGoalScorer
            ArrayOftTopSelectedGoalScorer
            tCardInfo
            tCards
            tCoaches
            tCountryInfo
            tCountrySelectedTopScorer
            tFullTeamInfo
            tGameCard
            tGameInfo
            tGameResultCode
            tGoal
            tGroupInfo
            tGroupsCompetitors
            tPlayerNames
            tPlayersWithCards
            tStadiumInfo
            tTeamCompete
            tTeamInfo
            tTopGoalScorer
            tTopSelectedGoalScorer
            tTournamentInfo

Como podem perceber, esse serviço tem 41 métodos que eu posso acionar para obter informações sobre a Copa do Mundo. Vamos ver como eu posso usar esses métodos.

:::python
resultado = cliente.service.RedCardsTotal()
print resultado

O resultado impresso pelo trecho acima é: 17.

Vamos todos dar um viva à simplicidade do Python! :o)

0 comentários: