Consume JAX WS SOAP Web Service That Requires Authentication Using Python

Auth SOAP Service

In this tutorial I will see how to consume or call JAX WS based SOAP web service that requires authentication. I will use Python program to consume the SOAP service. In my other example I had shown how to call SOAP webservice using Python but that service did not require any authentication.

I am going to use my existing JAX WS based SOAP service which I previously created using Java programming language. As the web service is language agnostic so you can build or consume the service using different programming languages.

Prerequisites

Authentication example in JAX WS webservice

Python 3.8.1/3.9.1/3.11.5

Call JAX WS SOAP using Postman

First I will show you how to call the SOAP webservice using Postman tool. You can also use SOAP UI for SOAP service testing but I think Postman is light-weight tool.

The WSDl URL is http://localhost:8888/jax-ws-auth/hello?WSDL.

Request Details

Here are the request details of the temperature converter SOAP service.

HTTPS Method: POST

Service URL: http://localhost:8888/jax-ws-auth/hello

Content-Type: text/xml (this should go in the Headers)

username: user (this should go in the Headers)

password: pass (this should go in the Headers)

Request Body:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ser="http://service.authentication.ws.jax.roytuts.com/">
   <soapenv:Header/>
   <soapenv:Body>
      <ser:sayHello>
         <arg0>Soumitra</arg0>
      </ser:sayHello>
   </soapenv:Body>
</soapenv:Envelope>

Response Details

Clicking on the Send button will give you the following response:

<?xml version='1.0' encoding='UTF-8'?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
    <S:Body>
        <ns2:sayHelloResponse xmlns:ns2="http://service.authentication.ws.jax.roytuts.com/">
            <return>Hello Soumitra</return>
        </ns2:sayHelloResponse>
    </S:Body>
</S:Envelope>

Call JAX WS SOAP using Python

Now I will see how to call JAX WS SOAP service using Python programming language.

I will write the Python code in Object Oriented way.

import http.client
import xml.dom.minidom

class soap_consumer:

	def __init__(self, msg):
		self.msg = msg
	
	def envelope(self):
		doc = xml.dom.minidom.Document()
		env = doc.createElement('soapenv:Envelope')
		env.setAttribute('xmlns:soapenv', 'http://schemas.xmlsoap.org/soap/envelope/')
		env.setAttribute('xmlns:ser', 'http://service.authentication.ws.jax.roytuts.com/')
		
		#print(self.msg)
		
		#XML input request data
		rawdom = xml.dom.minidom.parseString(self.msg)		
		messagenode = rawdom.firstChild
		
		op = doc.createElement('ser:sayHello')
		op.appendChild(messagenode)
		
		#Header
		header = doc.createElement('soapenv:Header')
		env.appendChild(header)
		
		#Body
		body = doc.createElement('soapenv:Body')
		body.appendChild(op)
		
		env.appendChild(body)
		doc.appendChild(env)
		
		#print(doc.toxml('utf-8'))
		
		return doc.toxml('utf-8')
	
	def send_request(self, url, path, content_type, accept, user, pwd):
		data = self.envelope()
		
		#print(data)
		#print(len(data))
		
		headers = {"Content-type" : content_type, "Accept": accept, "Content-length": len(data), "username": user, "password": pwd}
		conn = http.client.HTTPConnection(url, 8888)

		#print(conn)
		conn.request("POST", path, data, headers)
		
		response = conn.getresponse()
		resp_data = response.read()
		
		#print(resp_data)
		
		if response.status == 200:
			conn.close()
			return resp_data
		else:
			return 'Failed:' + str(response.status) + str(resp_data)

In the above Python code, I have imported required packages for calling the SOAP service. I am going to use XML as request in the body parameter of the service. The msg variable will hold the input request passed as XML.

You can always modify the code as per your requirements and idea here is to show you how to call SOAP service using Python programming.

Next I define a function which will build the envelop if it is XML.

The envelop which I have created here will work just for the specified service which was earlier tested using Postman tool. You have to modify the code if you have different structure.

I am using here SOAP version 1.1, hence I am using soapenv as a namespace.

Next I define send_request() function which takes a number of parameters for SOAP service.

Testing the Program

Executing the above Python program with below code snippets will give you the expected output.

Request

swsc = soap_consumer('<arg0>Soumitra</arg0>')
resp = swsc.send_request('localhost', '/jax-ws-auth/hello', 'text/xml; charset=utf-8', 'text/xml', 'user', 'pass')
print(resp)

Response

<?xml version=\'1.0\' encoding=\'UTF-8\'?><S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"><S:Body><ns2:sayHelloResponse xmlns:ns2="http://service.authentication.ws.jax.roytuts.com/"><return>Hello Soumitra</return></ns2:sayHelloResponse></S:Body></S:Envelope>

That’s all about how to consume SOAP web service that requires authentication.

Source Code

Download

Leave a Reply

Your email address will not be published. Required fields are marked *