Tuesday, May 27, 2008

Generating a Proxy

Here's what i did next. I just added a message interface called EmployeeService in the Message interfaces of my . I marked it as inbound synchronous method in the option. I couldn't find much documentation about what the various options mean however i assume that inbound means inbound message coming from client to the server and synchronous means that server would process them and give the results back to client then and there itself.
Now i selected the input and output messages and there you go . I got a nice wsdl which looks like the following....

<?xml version="1.0" encoding="ISO-8859-1"?>

<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:p1="http://sap.office.tst" name="EmployeeService" targetNamespace="http://sap.office.tst">
<wsdl:types>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://sap.office.tst" targetNamespace="http://sap.office.tst">
<xsd:element name="GetEmployeeInput" type="EmployeeId" />
<xsd:element name="GetEmployeeOutput" type="Employee" />
<xsd:simpleType name="EmployeeId">
<xsd:annotation>
<xsd:appinfo source="http://sap.com/xi/TextID">
a64268c22be811dda00f000bcd9b93dd
</xsd:appinfo>
</xsd:annotation>
<xsd:restriction base="xsd:string" />
</xsd:simpleType>
<xsd:complexType name="Employee">
<xsd:annotation>
<xsd:appinfo source="http://sap.com/xi/TextID">
a644d9c02be811dd90e2000bcd9b93dd
</xsd:appinfo>
</xsd:annotation>
<xsd:sequence>
<xsd:element name="Id" type="xsd:string">
<xsd:annotation>
<xsd:appinfo source="http://sap.com/xi/TextID">
4ca5845028aa11ddb1c2001321f4509b
</xsd:appinfo>
</xsd:annotation>
</xsd:element>
<xsd:element name="Name" type="Name">
<xsd:annotation>
<xsd:appinfo source="http://sap.com/xi/TextID">
4ca5845128aa11ddb4a1001321f4509b
</xsd:appinfo>
</xsd:annotation>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="Name">
<xsd:annotation>
<xsd:appinfo source="http://sap.com/xi/TextID">
a64994b02be811ddc2e4000bcd9b93dd
</xsd:appinfo>
</xsd:annotation>
<xsd:sequence>
<xsd:element name="FirstName" type="xsd:string">
<xsd:annotation>
<xsd:appinfo source="http://sap.com/xi/TextID">
93b077b028aa11ddcc0b001321f4509b
</xsd:appinfo>
</xsd:annotation>
</xsd:element>
<xsd:element name="LastName" type="xsd:string">
<xsd:annotation>
<xsd:appinfo source="http://sap.com/xi/TextID">
93b077b128aa11ddb07c001321f4509b
</xsd:appinfo>
</xsd:annotation>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
</wsdl:types>
<wsdl:message name="GetEmployeeInput">
<wsdl:documentation>
Input to GetEmployee Operation
</wsdl:documentation>
<wsdl:part name="GetEmployeeInput" element="p1:GetEmployeeInput" />
</wsdl:message>
<wsdl:message name="GetEmployeeOutput">
<wsdl:part name="GetEmployeeOutput" element="p1:GetEmployeeOutput" />
</wsdl:message>
<wsdl:portType name="EmployeeService">
<wsdl:operation name="EmployeeService">
<wsdl:input message="p1:GetEmployeeInput" />
<wsdl:output message="p1:GetEmployeeOutput" />
</wsdl:operation>
</wsdl:portType>
<ifr:properties xmlns:ifr="urn:com-sap:ifr:v2:wsdl">
<ifr:category>
ifmmessif
</ifr:category>
<ifr:methods>
<ifr:method name="EmployeeService">
<ifr:isSynchron>
true
</ifr:isSynchron>
<ifr:isInbound>
true
</ifr:isInbound>
<ifr:interfaceCategory>
inbound
</ifr:interfaceCategory>
</ifr:method>
</ifr:methods>
<ifr:messages>
<ifr:message name="GetEmployeeInput">
<ifr:messType>
ifmmessage
</ifr:messType>
<ifr:technicalNamespace>
http://sap.office.tst
</ifr:technicalNamespace>
</ifr:message>
<ifr:message name="GetEmployeeOutput">
<ifr:messType>
ifmmessage
</ifr:messType>
<ifr:technicalNamespace>
http://sap.office.tst
</ifr:technicalNamespace>
</ifr:message>
</ifr:messages>
</ifr:properties>
</wsdl:definitions>

As soon as i was done with this i though of generating a .NET proxy for this wsdl. (Me being a .NET developer i couldn't control my instincts and stay away from Visual Studio too long :) )

Anyways i tried to generate a proxy and failed. Basically nothing is generated. On looking closely at the wsdl i found that wsdl:service and wsdl:binding tags are missing. Which is understandable. If i was designing the ESR i wouldn't want the information about binding and implementation address in my repository. I would probably keep it somewhere else like UDDI. This is an open question that i need to figure out now. Where doesn SAP keep this information. I'll touch this back once i am sure that implementation works.

So leaving the visual studio i came back to my ABAP system and started sproxy to generate a implementation proxy for my wsdl. After struggling a lot with package concept of ABAP i was suggested to make the proxy as a local object. I still can't figure out why it can't be a server object.... Everyone i contacted gave me different reasons however i chose to believe that i do not have appropriate permissions to create a server side object. (Sad and interesting, since this is a sandbox i thought i have all the permissions)

So i have managed to generate a proxy for this wsdl in ABAP and now comes the first place where i would code. All i want to do is to give back the employee with some hardcoded name and passed id from the method. Once i am able to do this i would actually go ahead and find the answer to my first question i.e. where to find the binding and service info for this interface.

Another open question which looms large is to add another method to this interface. I choose to address this at the end.

~Abhishek

No comments: