web-dev-qa-db-ja.com

Perl CGIプログラムからJSON応答を送信するにはどうすればよいですか?

Perl/cgiプログラムからJSON応答を書いています。ヘッダーのコンテンツタイプは「application/json」である必要があります。しかし、応答がテキストファイルとしてスローされるため、認識されないようです。

JQueryのJSONライブラリを使用して応答をキャプチャします。 JSON応答の送信でどこが欠けていますか。

19
Rakesh

私はこれをPerl/cgiプログラムで行っています。

私はコードの先頭でこれらを使用します:

use CGI qw(:standard);
use JSON;

次に、jsonヘッダーを出力します。

print header('application/json');

これは次のコンテンツタイプです:

Content-Type: application/json

そして、次のようにJSONを出力します。

my $json->{"entries"} = \@entries;
my $json_text = to_json($json);
print $json_text;

私のJavaScriptは次のように呼び出し/処理します:

   $.ajax({
        type: 'GET',
        url: 'myscript.pl',
        dataType: 'json',
        data: { action: "request", last_ts: lastTimestamp },
        success: function(data){
            lastTs = data.last_mod;
            for (var entryNumber in data.entries) {
                 //Do stuff here
            }
        },
        error: function(){
            alert("Handle Errors here");
        },
        complete: function() {
        }
    });

インストールしたくない場合は、必ずしもJSONライブラリを使用する必要はありません。JSON形式のテキストを直接印刷できますが、PerlオブジェクトをJSONに変換するのは簡単です。

27
BrianH

PerlのWebフレームワークである Mason でリクエストを生成する方法は次のとおりです。

メイソンはパイロンまたはRuby on Rails。に類似しています

<%init>

use JSON;

my %hash = { a => 'a', b => 'b' };
my @list = ( 1, 2, \%hash );

# Mason object $r for Apache requests, automatically sets the header
$r->content_type('application/json');

# Pass a reference to anything (list, hash, scalar) for JSON to encode
my $json = new JSON;
print $json->encode(\@list);

</%init>

そしてそれを プロトタイプ 、JavaScript Webアブストラクションで処理します:

var req = new Ajax.Request('request.html', {
    method: 'get',
    parameters: {
        whatever: 'whatever'
    },
    onCreate: function() {
        // Whatever
    },
    onSuccess: function(response) {
        // This only works if you set the 'application/json' header properly
        var json = response.responseJSON;

        // Since you sent a list as the top-level thing in the JSON,
        // then iterate through each item
        json.each(function(item) {
            if (item instanceof Object) {
                item = new Hash(item);
            } else if (item instanceof Array) {
                // Do array stuff
            } else {
                // Do scalar stuff
            }
        });
    },
    onFailure: function() {
        // Failed
    }
});
1
Neil

タイプ「application/json」を指定した場合でも、テキストを解析する必要があります。 jQueryは、$。getJSON関数を使用してこれを行います。

$.getJSON("http://someurl.com/blabla.json",{some: "info"},function(json){
  alert(json["aKey"]["anotherOne"]);
});

(ここでは specs )。

しかし、おそらくあなたはすでにこれを知っているので、問題はどこかにあります:おそらく問題は無効であるため、json応答のサンプルを教えてください。なぜ「認識されていないようだ」と言うのか、私にはよくわかりません。jsonサービスを作成するとき、最初に行うテストは、ブラウザーでそれらを呼び出し、Firebugを起動して、それを解析しようとすることです(そう、応答はそうです)。これはテキスト応答ですが、javascriptを解析して、jsonオブジェクトを返すことは非常に喜ばしいことです)。

1
cheng81