I like some of the things that Catalyst::Controller::REST does, you might take a look at it -- it follows a similar approach to what you are proposing, but in the context of Catalyst.
in reply to A RESTful API framework
In particular, it unpacks the supplied content (if you want) based on the format specified by the "Content-Type" header, and serializes your output data structure. (It uses Content-Type for that too -- I think it should use "Accept" for that.)
Your GET/PUT/POST handler doesn't have to deal with that at all, but the user can supply input in whatever format they want: XML, YAML, JSON, etc. and consume your results however they want. The perl handler can just deal with native perl data structures.