Hey guys,

I managed to build in callback support, and I draw your attention to
the implementation here:
http://github.com/opyate/Ken/blob/master/ken-server/src/main/scala/com/opyate/ken/lib/API.scala

Excerpt:

<snip>
override def dispatch: LiftRules.DispatchPF = {
    // modify the returned function to one which converts the result
to JSON
    // or a pure LiftResponse (usefull when HTTP response code is not
200)
    dispatchMethod.andThen(x =>
      {
        val unboxed = unbox(x)
        unboxed match {
          case l:LiftResponse => { () => Full(l) }
          case _ => { () => {
            if (S.param("callback").isEmpty) {
              Full(
                JsonResponse(
                  jsonAttributes(
                    unbox(x)
                  )
                )
              )
            } else {
              Full(
                JavaScriptResponse(
                  JE.JsFunc(S.param("callback").open_!,
                    jsonAttributes(
                      unbox(x)
                    )
                  ).cmd
                )
              )
            }
            }
          }
        }
      }
    )
  }
</snip>

So, basically it will handle any callback function name you give it,
because it will just echo it back in the response. (default for jQuery
JSONP is "C").

Please be very critical of my code: I'm not doing things properly, or
in a particularly functional manner, but I'm learning :-)

Shameless plug: another little Scala/Lift project of mine which I'd
like feedback on:
http://wiki.github.com/opyate/yauser

Thanks, and happy coding!
Juan


On Oct 6, 6:23 pm, opyate <opy...@gmail.com> wrote:
> Sorry - APIResponse code not borrowed from skittr, but ESME (http://
> incubator.apache.org/esme/)
> Thus, depending on your call's extension (.json or .xml) you can serve
> the response in the required format.
>
> Anyhoo, back to the question... :-)
>
> Thanks,
> Juan
>
> On Oct 6, 5:48 pm, Juan M Uys <opy...@gmail.com> wrote:
>
>
>
> > Hi Lifters,
>
> > I'm building a REST server and a separate stand-alone DHTML client
> > which won't necessarily be hosted on the same server. Some browsers do
> > not support cross site Ajax, henceJSONP(i.e. callback support).
>
> > My DHTML client now makes calls like the following, using jQuery:
>
> > <snip>
> > GET /api/version.json?callback=C&_1254838856015= HTTP/1.1
> > Host: localhost:8080
> > User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US;
> > rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3
> > Accept: */*
> > Accept-Language: en-us,en;q=0.5
> > Accept-Encoding: gzip,deflate
> > Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
> > Keep-Alive: 300
> > Connection: keep-alive
> > Cookie: JSESSIONID=13k8ykwq2u2w6
> > </snip>
>
> > I need to know if I need to build manual support in for the callback:
> > * grab the token 'C'
> > * generate a JsCmd named 'C' with my JSON response as parameter (It
> > will be great if someone can suggest which parts of the Lift API to
> > use for this)
> > * send it back to the client (as an extra parameter to the original
> > JSON, or on it's own?)
>
> > It doesn't seem like Lift automatically picks up on "?callback=" (it's
> > not a standard, so - understandable), and my response looks like this:
>
> > <snip>
> > HTTP/1.1 200 OK
> > Content-Length: 16
> > Content-Type: application/json
> > X-Lift-Version: 1.1-SNAPSHOT
> > Server: Jetty(6.1.21)
>
> > {"version": "1"}
> > </snip>
>
> > The above response is generated by:
>
> > <snip>
> > def version(): Box[APIResponse] = {
> >     Full(
> >       Right(
> >         Map("version" ->
> >           Map("version" -> APIHelper.getParam("api.version"))
> >         )
> >       )
> >     )
> >   }
> > </snip>
>
> > ...where APIResponse is borrowed from TwitterResponse (from the skittr 
> > example).
>
> > Another problem I have is that Firefox complains about "invalid label"
> > for the above response, so I think wrapping it up in a callback will
> > fix it.
>
> > Here's an answer related to PHP for this 
> > issue:http://stackoverflow.com/questions/790910/jquery-getjson-to-external-...
>
> > Thanks,
>
> > --
> > juan
> > +44 7702 783 956

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Lift" group.
To post to this group, send email to liftweb@googlegroups.com
To unsubscribe from this group, send email to 
liftweb+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/liftweb?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to