in reply to Re: Perl CGI return 400 Bad request response with JSON content
in thread Perl CGI return 400 Bad request response with JSON content

working as expected. Return status as 200 and content in JSON
print CGI::header({type => 'application/json', status => '200 OK', print "$json_encoded_data";
Not working code, Returning as 400 status but content type is html only.
print CGI::header({type => 'application/json', status => '400 Bad Requ +est', print "$json_encoded_data";

Replies are listed 'Best First'.
Re^3: Perl CGI return 400 Bad request response with JSON content
by cavac (Prior) on Apr 04, 2022 at 09:11 UTC

    Let's look at the RFC for HTTP status code 400:

    6.5.1. 400 Bad Request The 400 (Bad Request) status code indicates that the server cannot +or will not process the request due to something that is perceived to +be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).

    Basically, "400" code tells the server that you did not properly understood the request or refused to parse it. Depending on your webserver software, it may choose to interpret that to mean "i could not make sense of this, send the default error page".

    Are you SURE this is actually the error code you want to use? It basically means "i did not understand your request at all".

    Unless the client sent complete garbage, in all likelyhood there is a HTTP status code from the 4xx group that will fit better. Take a look.

    perl -e 'use Crypt::Digest::SHA256 qw[sha256_hex]; print substr(sha256_hex("the Answer To Life, The Universe And Everything"), 6, 2), "\n";'
Re^3: Perl CGI return 400 Bad request response with JSON content
by Anonymous Monk on Apr 04, 2022 at 09:14 UTC

    Your code has syntax errors and does not compile. Please help us help you by making your problem reproducible.

    What server are you using to host this service? How is it set up? Which exact response (including all headers) are you receiving in both cases?

      it got worked after using below line Apache2::RequestUtil->request->rflush;
        if($validParams) { # ... print $json_output_encoded; # ... } else { # ... Apache2::RequestUtil->request->custom_response(400,$json_output_en +coded);
        Is this a CGI or some mod_perl code? If it's a CGI and you haven't set something up to load Apache2::RequestUtil by default, this could be the reason for the error. What happens if you do the same thing (print $json_output_encoded;) in both your if branches?