[Seaside] WAResponse and XML

Philippe Marschall philippe.marschall at gmail.com
Fri Aug 5 06:01:56 UTC 2011


2011/8/4 Jay Hardesty <jayh at panix.com>:
>
> On Aug 4, 2011, at 8:04 AM, Philippe Marschall wrote:
>
>> 2011/8/4 Jay Hardesty <jayh at panix.com>:
>>>
>>> Hi - I'm having a problem returning XML as a response from within a Seaside app, after moving to 3.0.
>>>
>>> I used to return XML by:
>>>
>>>        self session returnResponse:
>>>                (WAResponse new
>>>                        contentType: 'text/xml';
>>>                        nextPutAll: xmlString;
>>>                        yourself)
>>>
>>> but t in Seaside 3.0 I get:
>>>        'You can no longer return a new WAResponse instance. You must instead modify the Response contained in the active RequestContext. Look for senders of #respond: and #response for examples.'
>>>
>>>
>>> Following the nearest examples I can find I tried:
>>>
>>>        self requestContext respond: [:response |
>>>                | document |
>>>                document := MIMEDocument
>>>                        contentType: 'text/xml';
>>>                        content: xmlString.
>>>                response document: document]
>>>
>>> and:
>>>
>>>        self requestContext respond: [:response |
>>>                response
>>>                        contentType: 'text/xml';
>>>                        nextPutAll: xmlString]
>>>
>>> but in both cases an html document arrives downstream (with XML in the body) rather than the XML itself as previously
>>>
>>> Think I'm missing something basic here... Thanks very much for any pointers,
>>
>> That should absolutely work. The sample code below works for me.
>> You'll probably want to test with Firefox because it renders XML
>> nicely.
>>
>> renderContentOn: html
>>       html anchor
>>               callback: [
>>                       self requestContext respond: [ :response |
>>                               response
>>                                       contentType: 'text/xml';
>>                                       nextPutAll: '<?xml version="1.0"
>> encoding="UTF-8"?><hello><world/></hello>' ] ];
>>               with: 'XML'
>>
>> Cheers
>> Philippe
>> _______________________________________________
>> seaside mailing list
>> seaside at lists.squeakfoundation.org
>> http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside
>
>
> Thank you Phillipe - Yes, your code works for me just as you described.
>
> I guess my problem is that I want my renderContentOn: to immediately return XML in certain circumstances without any user action.  As in this variation on your code example:
>
>        renderContentOn: html
>                self requestContext respond: [ :response |
>                        response
>                                contentType: 'text/xml';
>                                nextPutAll: '<?xml version="1.0" encoding="UTF-8"?><hello><world/></hello>' ]

That doesn't work. Components are made to generate HTML and in this
case a lot of HTML (<DOCTYPE>, <head>, <body>, …) has already been
generated. You have two options. First you can configure your
components to generate XML. See Seaside-WebServices-Core and
Seaside-Tests-WebServices in the addons repository [1] for examples.
However unless you need #call: and callbacks and friends I found
recommend to use Seaside-REST, also from the addons repository. There
is a short overview on the wiki [2] and you can find some examples
here [3].


> If I call this from Firefox, then instead of XML (as in your example) I see
>        "XML Parsing Error: XML or text declaration not at start of entity[...]"
> and viewing the page source gives:
>        "<!DOCTYPE html PUBLIC [...]"
>
>
> Whereas my old code:
>
>        renderContentOn: html
>                self session returnResponse:
>                        (WAResponse new
>                                contentType: 'text/xml';
>                                nextPutAll: <?xml version="1.0" encoding="UTF-8"?><hello><world/></hello>' ;
>                                yourself)
>
> returned and displayed XML just as your example, but without any user action
>
> So what I'm apparently missing is whatever magic happens as a result of the anchor callback being fired in your example.  I wonder if there's any way to get that kind of callback behavior programatically(?)
>
>
>> What do you mean with non-Seaside client? Is it a non-browser
>> application, non-HTML application? I
>
>
> Yes, I'm using Seaside apps to serve (music score data) to
> - Seaside web client
> - Flash web client
> - iPhone app
> - code running in Second Life
> - Croquet environment
>
>> In those cases you can still use
>> Seaside. You can either directly write RequestHandlers or you can have
>> a look at Seaside-REST.
>
> Interesting - I'll try to find an example using WARequestHandler, though I suppose this will mean moving the functionality out of my Seaside app (WAComponent subclass)...

Yes. You can look at WAFileHandler for a complicated examples, for
simple ones look at Seaside-Benchmark in the addons repository [1].

> Thanks very much for the tips, and for your example which has helped me narrow the scope of the problem
>

 [1] http://www.squeaksource.com/Seaside30Addons
 [2] http://code.google.com/p/seaside/wiki/SeasideRest
 [3] http://www.squeaksource.com/orion

Cheers
Philippe


More information about the seaside mailing list