You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@struts.apache.org by Pedro Salgado <sa...@04web.com> on 2004/06/04 23:31:08 UTC

Re: Controller for web services

  (to frank) I really have to read more carefully this answer and post a
reply (I already answered some things on the web services enablement thread
:D).
My web services background has improved (thanks to more than 30
articles+books) but I need more time to analyze the solution you are
proposing and check your framework more carefully.

  I found some answers in the Java development with ant sample chapter and
on the Axis documentation.

  I will gather all together and then make a reply.

  (to all) Thank you for your help.

Pedro Salgado

On 04/05/21 15:21, "None None" <fz...@hotmail.com> wrote:

> Another option is what I've implemented in a project recently...
> 
> First, every single Web Service request is directed to a single Action
> mapping, quit originally called /WebServices.app :)
> 
> Then, in the action I first check for the SOAPAction header, making the
> assumption that only a valid Web Service request will contain it (that's not
> a requirement of the SOAP spec as far as I know, but generally people and
> products to adhere to that rule, and certainly you can tell your clients
> they must to use your services).  If it's not found I forward to an error
> page, presumably someone would see it, if not, too bad :)
> 
>> From then on, it's really just a question of parsing the SOAP envelope...
> all my services at this point I've dictated must be "flat", i.e., no nested
> XML nodes, in other words, all elements are a child of the root node (that
> to me is relatively flat, at least relative to the root node).  This is
> actually sufficient for the vast majority of our services.  The only reason
> I did it this way was that it made dealing with the SOAP message very easy:
> just read the body of the request, which is the SOAP message, and parse it
> with normal XML parsing classes.  I didn't need to get any special SOAP
> parsing classes for this.  Obviously a more robust solution would, but this
> was done with simplicity in mind.
> 
> Part of the WSDL spec for all my services is a RequestedService element.
> This, unbeknownst to the caller, is actually a class name (for instance,
> ChangePassword is one, FindAccount is another).  I have a package
> com.company.app.webservices where all these classes live.  So, I instantiate
> the class, which extends from a custom abstract class I wrote called
> WSHandler, and passed control to it to do whatever it is that it does (which
> in all cases here is a call to the business logic classes of the larger
> app).
> 
> Before I forget, there is also a UserID and Password element requried for
> all requests, and I do the same validation on the WS requests as I would any
> other non-service request through this system.
> 
> The WSHandler class basically contains three methods: startResponse,
> endResponse and process.  The first two, as the name implies, writes out the
> common portions of the SOAP envelope.  For example,. here's the actual
> startResponse method:
> 
> // Must be called first in the process method.
> void startResponse(HttpServletResponse wsResponse) throws Exception {
> 
>   wsOutBuffer = new StringBuffer();
>   wsOutBuffer.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n");
>   wsOutBuffer.append("<soap:Envelope
> xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"
> xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"
> xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">\n");
>   wsOutBuffer.append("  <soap:Body>\n");
> 
> } // End startResponse()
> 
> Very straight-forward.  The process() method is what the Action calls, and
> as the comment above says, it must start by calling startResponse(). Then,
> it does it's work and constructs the payload of the SOAP message.  Here's an
> example from the ChangePassword service:
> 
> public void process(HashMap wsParameters, String logonMessage) throws
> Exception{
>     // Get the parameters we need for the call
>     String userID          = (String)wsParameters.get("userID");
>     String currentPassword = (String)wsParameters.get("currentPassword");
>     String newPassword     = (String)wsParameters.get("newPassword");
>     if (userID          == null) { userID          = ""; }
>     if (currentPassword == null) { currentPassword = ""; }
>     if (newPassword     == null) { newPassword     = ""; }
>     // Instantiate needed function beans
>     Connection conn = DBConnectionManager.createConnection();
>     UsersFB    usFB = new UsersFB(conn);
>     // Call the function bean to do our work
>     boolean cpResult = usFB.changePassword(userID, currentPassword,
> newPassword);
>     // Finalize the function bean
>     usFB.cleanup();
>     // Generate our output and return it
>     startResponse(workContext);
>       writeResponse("    <ChangePasswordResponse
> xmlns=\"TOAWebServices\">");
>       writeResponse("      <result>");
>       if (cpResult) {
>         writeResponse("      Password Changed");
>       } else {
>         writeResponse("      Password NOT Changed");
>       }
>       writeResponse("      </result>");
>       writeResponse("    </ChangePasswordResponse>");
>     finishResponse();
> } // End process()
> 
> Again, really fairly simple.
> 
> Now, the downside to this of course is that in order to expose existing code
> as a service, you have to implement a class for it extended from WSHandler,
> so it's not as straight-forward as some of the real Web Service packages out
> there (Axis and others).  But, it is really very simple, and has the benefit
> of not requiring anything special outside the JDK (1.4.2 anyway if I
> remember correctly, 1.3.1 you'd have to add the XML parsing stuff as I
> recall).  I personally like not having extra dependencies where I can avoid
> them, and this does that.
> 
> Naturally, this won't do for all cases, but for simpler services it should
> do the trick nicely, and has for me.  It's not perfect, but depending on
> your needs might be a good fit.
> 
> Let me know if anyone has questions if they are interested in doing
> something like this, I'll try and answer any I can.
> 
>> From: <sa...@04web.com>
>> Reply-To: "Struts Users Mailing List" <us...@struts.apache.org>
>> To: <st...@jakarta.apache.org>
>> Subject: RE: Controller for web services
>> Date: Fri, 21 May 2004 11:35:05 +0100 (WEST)
>> 
>> 
>>   Thank you (sorry for the direct reply... bad webmail :( ).
>> 
>>   I'll do just that.
>> 
>> Pedro Salgado
>> 
>>> I believe Axis has stuff for doing this kind of thing, but Im only just
>>> starting to learn it myself so still dont know all the details. What Ive
>>> seen is pretty cool though!
>>> 
>>> They have a rather active user list so Im sure if you ask there someone
>>> will be able to help :-)
>>> 
>>> regards
>>> Andrew
>>> 
>>> -----Original Message-----
>>> From: salgado.pc@04web.com [mailto:salgado.pc@04web.com]
>>> Sent: Friday, 21 May 2004 18:17
>>> To: andrew.david.hill@gridnode.com
>>> Subject: RE: Controller for web services
>>> 
>>> 
>>> 
>>>   Yes, Axis is what I need. (thank you Andrew)
>>>   But is there any "Controller" for web services?
>>>   Do I need to have a different class for each web service and then do
>>> the
>>> security, authorization refactoring by myself?
>>> 
>>> 
>>>   Now:
>>>   WS1 -> 1 class W1 -> calls methods in a predefined and obliged order
>>> WS2 -> 1 class W2 -> calls methods in a predefined and obliged order
>>> 
>>>  What I have in mind
>>>   WS1 ... WSn -> controller -> check authentication/authorization ->
>>> dispatch to a class that consumes the web service and sends a response.
>>> 
>>>   Struts isn't the answer because I am not processing HTTP requests...
>>> so :(
>>> 
>>> Pedro Salgado
>>> 
>>>> Have a look at Axis (also an Apache project). It will probably do what
>>>> you need.
>>>> 
>>>> -----Original Message-----
>>>> From: Pedro Salgado [mailto:salgado.pc@04web.com]
>>>> Sent: Friday, 21 May 2004 13:20
>>>> To: Struts Users List
>>>> Subject: Controller for web services
>>>> 
>>>> 
>>>> 
>>>>   Is there any MVC implementation for web services (I am not seeing
>>>> any
>>>> wasy
>>>> way to do that with Struts)?
>>>> 
>>>>   Thank you,
>>>> 
>>>> Pedro Salgado
>>>> 
>>>> 
>>>> ---------------------------------------------------------------------
>>>> To unsubscribe, e-mail: user-unsubscribe@struts.apache.org
>>>> For additional commands, e-mail: user-help@struts.apache.org
>>>> 
>>>> 
>>>> 
>>>> ---------------------------------------------------------------------
>>>> To unsubscribe, e-mail: user-unsubscribe@struts.apache.org
>>>> For additional commands, e-mail: user-help@struts.apache.org
>> 
>> 
>> 
>> 
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: user-unsubscribe@struts.apache.org
>> For additional commands, e-mail: user-help@struts.apache.org
>> 
> 
> _________________________________________________________________
> Best Restaurant Giveaway Ever! Vote for your favorites for a chance to win
> $1 million! http://local.msn.com/special/giveaway.asp
> 
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: user-unsubscribe@struts.apache.org
> For additional commands, e-mail: user-help@struts.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscribe@struts.apache.org
For additional commands, e-mail: user-help@struts.apache.org