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