Я пишу ответ в формате JSON от программы perl / cgi. Тип содержимого заголовка должен быть «application / json». Но, похоже, он не распознается, поскольку ответ выдается в виде текстового файла.
Я бы собирал ответ, используя JSON-библиотеку jQuery. Где мне не хватает при отправке ответа JSON.
Да. Я получил его, используя третий ответ. В любом случае спасибо
Затем вы должны принять третий ответ (щелкните галочку).
Часто бывает полезен пример кода, показывающий то, что вы уже пробовали. :)
Есть третий ответ?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Даже если вы укажете тип «application / json», вам все равно нужно будет разобрать текст. jQuery сделает это за вас, используя функцию $ .getJSON, то есть:
$.getJSON("http://someurl.com/blabla.json",{some: "info"},function(json){
alert(json["aKey"]["anotherOne"]);
});
(здесь спецификации).
Но, возможно, вы уже знаете об этом, поэтому проблема находится в другом месте: не могли бы вы рассказать нам образец вашего ответа json, потому что, возможно, проблема в том, что он недействителен. Мне не совсем понятно, почему вы говорите, что «похоже, не распознается»: когда я пишу json-сервисы, первый тест, который я делаю, - это вызвать их в браузере и, возможно, запустить firebug и попытаться его проанализировать (так что да, ответ это текстовый ответ, но javascript по-прежнему рад его проанализировать и вернуть объект json).
Я делаю это в программе 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 в prety JSON.
У меня были ошибки в моем JSON. Большое спасибо, это сработало как шарм
Вы должны использовать application / json в качестве заголовка и найти способ установить заголовок в запросе с помощью вашей веб-платформы, поскольку печать заголовка не обязательно будет работать.
Вот как сгенерировать запрос в Мейсон, веб-фреймворке для Perl.
Mason аналогичен Pylons или 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:
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
}
});
Как вы отправляете ответ? Вы используете CGI.pm?