Till vissa av webservice'arna går det att skicka med soap-headers. Dessa soap-headers används tex för att kunna skicka med egen data som ska gå att nå från plugin-implementationer. Exempel på sådan data är tex en säkerhetstoken som serialiserats till en sträng, denna kan sedan deserialiseras i plugin'et och användas för att tex få rättigheter att läsa/skriva i databas eller liknande.

Saknar webservice-ramverket stöd för att skicka med soap-headers så kan dessa parametrar läggas till i query-strängen för webservicens endpoint, se exempel 2.

1. Exempel i c# där soap-headers skickas med. 

//Skapa webservice-klienten
cpx.Applikationsservice appserv=new cpx.Applikationsservice();
 
//Sätt metadata
cpx.setMetaData setMetaData = new cpx.setMetaData();
setMetaData.MetaDataNamnVaerde_1 = new cpx.MetaDataNamnVaerde[] {new cpx.MetaDataNamnVaerde(), new cpx.MetaDataNamnVaerde(), new cpx.MetaDataNamnVaerde()};
// Sätt metadata som styr vilken konfigurationsfil som ska användas.
// I detta exempel läses inställningarna således från [classpath]/capitex/componentmodel/laaneloefte/capitex_customer_config.xml.
setMetaData.MetaDataNamnVaerde_1[0].Namn = "CX.GROUP";
setMetaData.MetaDataNamnVaerde_1[0].Vaerde = "laaneloefte";
// Sätt metadata som anger prefix för egna parametrar.
setMetaData.MetaDataNamnVaerde_1[1].Namn = "CX.CONTEXTPREFIX";
setMetaData.MetaDataNamnVaerde_1[1].Vaerde = "EX";
// Sätt en egen parameter som ska gå att hämta från plugin.
setMetaData.MetaDataNamnVaerde_1[2].Namn = "EX.SECURITYTOKEN";
setMetaData.MetaDataNamnVaerde_1[2].Vaerde = "HE34/HJ?K79#8GHJ¤809H3BJK=";
appserv.setMetaDataValue = setMetaData;
// Sätt inparametrar till funktionen ListaAllaKalkylerFoerEnPerson.
cpx.ListaAllaKalkylerFoerEnPerson ListaAllaKalkylerFoerEnPerson;
ListaAllaKalkylerFoerEnPerson = new cpx.ListaAllaKalkylerFoerEnPerson();
ListaAllaKalkylerFoerEnPerson.string_1 = "198309092962";
// Anropa webservice.
cpx.KalkylInfo[] kalkylinfo;
kalkylinfo = appserv.ListaAllaKalkylerFoerEnPerson(ListaAllaKalkylerFoerEnPerson);
System.Windows.Forms.MessageBox.Show(kalkylinfo[0].Kalkylnamn);

2. Samma exempel som ovan fast utan soap-headers.

Tänk på att parametrarnas värde måste URL-kodas om denna metod anväds.

// Skapa webservice-klienten.
cpx.Applikationsservice appserv = new cpx.Applikationsservice();
// Sätt metadata som styr vilken konfigurationsfil som ska användas.
// I detta exempel läses inställningarna således från //[classpath]/capitex/componentmodel/laaneloefte/capitex_customer_config.xml.
appserv.Url += "?CX.GROUP=laaneloefte";
// Sätt metadata som anger prefix för egna parametrar.
appserv.Url += "&CX.CONTEXTPREFIX=EX";
// Sätt en egen parameter som ska gå att hämta från plugin.
appserv.Url += "&EX.SECURITYTOKEN=GHJE9823324HJK378";
// Sätt inparametrar till funktionen ListaAllaKalkylerFoerEnPerson.
cpx.ListaAllaKalkylerFoerEnPerson ListaAllaKalkylerFoerEnPerson;
ListaAllaKalkylerFoerEnPerson = new cpx.ListaAllaKalkylerFoerEnPerson();
ListaAllaKalkylerFoerEnPerson.string_1 = "198309092962";
// Anropa webservice.
cpx.KalkylInfo[] kalkylinfo;
kalkylinfo = appserv.ListaAllaKalkylerFoerEnPerson(ListaAllaKalkylerFoerEnPerson);
System.Windows.Forms.MessageBox.Show(kalkylinfo[0].Kalkylnamn);

3. Exempel i java med jax-rpc där soap-headers skickas med.

Lösningen nedan visar hur man alltid kan göra för att skicka med soap-headers med jax-rpc, det finns dock jax-rpc-ramverk som kan generera bättre klient-stubbar där man direkt kan komma åt soap-headers utan att behöva hacka i soap-meddelandet. Man kan ofta med en konfigurationsfil påverka hur klient-stubben genereras och ofta är det där man kan ange att man vill hantera soap-headers. Oracle's jax-rpc-implementation tex har bättre stöd för soap-headers så att det påminner mer om exemplet i c# ovan.

Viss namngivning på de genererade klasserna skiljer sig åt beroende på vilket ramverk man använder. Exempel:

Sun's

IBM's (WebSphere)

Applikationsservice_Impl

ApplikationsserviceLocator

ApplikationsserviceSEI_Stub

ApplikationsserviceSEIBindingStub

Det verkar också som om man i WebSphere ska ärva klassen com.ibm.wsspi.webservices.rpc.handler.GenericHandler istället för javax.xml.rpc.handler.GenericHandler.

package test;
import java.rmi.RemoteException;
import javax.xml.namespace.QName;
import javax.xml.rpc.ServiceException;
import java.util.List;
import javax.xml.rpc.handler.*;
import javax.xml.rpc.Stub;
import javax.xml.soap.*;
public class test extends javax.xml.rpc.handler.GenericHandler {
private void addmetadata(SOAPElement container, String namn, String vaerde) throws SOAPException {
SOAPElement MetaDataNamnVaerde;
SOAPElement MetaDataNamn;
SOAPElement MetaDataVaerde;
MetaDataNamnVaerde = container.addChildElement("MetaDataNamnVaerde_1");
MetaDataNamn = MetaDataNamnVaerde.addChildElement("Namn");
MetaDataVaerde = MetaDataNamnVaerde.addChildElement("Vaerde");
MetaDataNamn.setValue(namn);
MetaDataVaerde.setValue(vaerde);
}
 
public boolean handleRequest(MessageContext ctx) {
// Typecast till soap-message...
javax.xml.rpc.handler.soap.SOAPMessageContext context = (javax.xml.rpc.handler.soap.SOAPMessageContext)ctx;
try {
// Hämta soap-meddelandet.
javax.xml.soap.SOAPMessage mes=context.getMessage();
// Hämta soap-envlope.
javax.xml.soap.SOAPEnvelope envl=mes.getSOAPPart().getEnvelope();
// Hämta header om den finns med.
javax.xml.soap.SOAPHeader header=envl.getHeader();
// Finns inte header lägg till den.
if (header == null) header = envl.addHeader();
// Lägg till namespace-deklaration för det namespace där
// de komplexa metadata-typerna är deklarerade, i WSDL'en kan man
// se vad detta ska vara, där kan man också se vilka element som
// ska vara med i header'n och hur.
header.addNamespaceDeclaration("metadata", "types.Applikationsservice.servlet.metaservice.webbgraenssnitt.boendekalkyl.capitex");
// Lägg till elementet setMetaData med namespace-prefix metadata dvs <metadata:setMetaData />.
SOAPElement setMetaData = header.addChildElement("setMetaData", "metadata");
// Följande rader lägger till poster med namn/värde i elementet setMetaData
// <MetaDataNamnVaerde_1><Namn>X</Namn><Vaerde>Y</Vaerde></MetaDataNamnVaerde_1>.
addmetadata(setMetaData,"CX.GROUP","test");
addmetadata(setMetaData,"CX.CONTEXTPREFIX","EX");
addmetadata(setMetaData,"EX.SECURITYTOKEN","HE34/HJ?K79#8GHJ¤809H3BJK=");
// Att skriva ut hela anropet kan vara bra i debug-syfte.
 
context.getMessage().writeTo(System.out);
} catch (java.lang.Exception ex) {
ex.printStackTrace();
}
return true;
}
public QName[] getHeaders() {
return null;
}
public static void main(String [ ] args) throws RemoteException, ServiceException {
String protocol = "http";
String host = "kalkylapp.test.capitex.se";
String appver = "boendekalkyl2009_25e";
String service = "services/Boende/Applikationsservice";
String endpointurl = protocol+"://"+host+"/"+appver+"/"+service;
 
// Skapa en instans av service-klienten.
bk2.Applikationsservice serv = new bk2.Applikationsservice_Impl();
// Hämta namespace för service-funktionerna.
String servicenamespace = serv.getServiceName().getNamespaceURI();
// Skapa ett portnamn för service-funktionerna.
QName portName = new QName(servicenamespace,"ApplikationsserviceSEIPort");
// Hämta listan med handlers som ska processa anropet.
List handlerchain = serv.getHandlerRegistry().getHandlerChain(portName);
// Lägg till vår egna handler som ska lägga till soap-headers.
handlerchain.add(new HandlerInfo(test.class, null, null));
// Hämta klient-stubben för webservice-funktionerna.
bk2.ApplikationsserviceSEI_Stub astub = (bk2.ApplikationsserviceSEI_Stub)serv.getApplikationsserviceSEIPort();
// Sätt URLen dit anropen ska ske.
astub._setProperty(Stub.ENDPOINT_ADDRESS_PROPERTY, endpointurl);
// Sätt användarnamn.
astub._setProperty(Stub.USERNAME_PROPERTY, "demo");
// Sätt lösenord.
astub._setProperty(Stub.PASSWORD_PROPERTY, "demo");
bk2.ClsIn kalkyl;
// Anropa en av funktionerna i webservicen.
kalkyl = astub.haemtaKalkylViaKalkylID("2414dfc_120a49d5416_7fc1");
// Printa ut ett av fälten i datat som vi hämtade.
System.out.println(kalkyl.getKalkylInformation().getKalkylID());
}
}