Beefy Boxes and Bandwidth Generously Provided by pair Networks
There's more than one way to do things
 
PerlMonks  

Re: Reading Raw data in CGI::Application

by andyford (Curate)
on Jan 04, 2007 at 21:18 UTC ( #593021=note: print w/ replies, xml ) Need Help??


in reply to Reading Raw data in CGI::Application

I've been using the JSON header via CGI::Application::Plugin::JSON to send data from a CGI::Application webapp. Say you have a runmode called "blackout". Here's an untested sketch:

sub blackout { my $self = shift; my $message = 'hi!'; $self->header_add(-type=>"text/plain"); my $query = $self->query(); my $output = $query->start_html(); $output .= $query->span($message); $self->add_json_header(boStatus=>'OK'); $self->add_json_header(boError=>'SUCCESS'); $self->add_json_header(boMessage=>$message); $output .= $query->end_html; return $output; }
Notice the span tag: I couldn't find a way to get it working without putting someting in the body of the page, so I just stuck the message in there. Figured it would at least mean something if it ever got displayed by a browser.

Now on the other end, I'm using the prototype library to get the JSON out of the header.

I don't know how to do Ajax without prototype, so this is the best I can give you.

function tryJSON(app) { var url = '/cgi-bin/TryCGIApp.cgi'; var params = "mode=blackout"; new Ajax.Request(url, { onSuccess : function(resp,jsonheader) { var foo = jsonheader.boStatus; var funk = jsonheader.boError; alert("The response from the server is: " + foo + " and " ++ funk); }, onFailure : function(resp) { alert("Oops, there's been an error."); }, parameters : params }); }

I assume there's some way to reverse this process, with the javascript adding the JSON headers, but I haven't gotten that far yet...If you get it, please post!

Update:  explicitly mention CGI::Application::Plugin::JSON

non-Perl: Andy Ford


Comment on Re: Reading Raw data in CGI::Application
Select or Download Code
Re^2: Reading Raw data in CGI::Application
by derby (Abbot) on Jan 05, 2007 at 13:32 UTC

    ++ and thanks for the clue about CGI::Application::Plugin::JSON (I hadn't seen that). I've been using JSON but instead of header type text/plain, I've been using application/json (which is outlined in the rfc).

    -derby
      Quick solution <if anybody still needed on sending json for runmode>
      sub send_json_data: Runmode { my $self = shift; $self->header_add(-type=>"application/json"); ... }
      OR refer this inside of CGI::Application::Plugin::JSON import() >> _send_headers() should take care of it.. though, its not taking care of for above runmode to return json data.
      sub _send_headers { my $self = shift; my $private = $self->param('__CAP_JSON') || {}; if( defined $private->{header} ) { $self->header_add( '-x-json' => $self->json_header_string ); } if( defined $private->{json_body} ) { $self->header_add('-type' => 'application/json'); } elsif ( defined $private->{json_callback} ) { $self->header_add('-type' => 'text/javascript'); } }

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://593021]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others perusing the Monastery: (14)
As of 2015-07-06 21:37 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (83 votes), past polls