Ошибка синтаксического анализа с использованием jsonlib

#javascript #json #parsing #goo.gl

#javascript #json #синтаксический анализ #goo.gl

Вопрос:

Я немного поиграл с goo.gl API и Javascript, использующие jsonlib следующим образом:

 function googl(url, cb) {
    jsonlib.fetch({
        url: 'https://www.googleapis.com/urlshortener/v1/url?key=<my-api-key>',
        header: 'Content-Type: application/json',
        data: JSON.stringify({longUrl: url})
    }, function (m) {
        var result = null;
        try {
            result = JSON.parse(m.content).id;
            if (typeof result != 'string') {
                result = null;
            }
        } catch (e) {
            result = null;
        }
        cb(result);
    });
}
  

Но когда я пытаюсь запустить это, я получаю эту ошибку:

Ошибка ссылки: не удается найти переменную: jsonlib_cb_1307278663586 — выборка: 1

Содержимое fetch:1 :

 jsonlib_cb_1307278663587({"url": "https://www.googleapis.com/urlshortener/v1/url?key=<my-api-key>", "headers": {"via": "HTTP/1.1 GWA", "x-content-type-options": "nosniff", "x-google-cache-control": "remote-fetch", "expires": "Fri, 01 Jan 1990 00:00:00 GMT", "server": "GSE", "x-xss-protection": "1; mode=block", "etag": ""0CNIIHrQYpIA69r1Pk9QCe1kzwI/u2pHqKdqG-dNhbJgEDlvIXi9lWk"", "pragma": "no-cache", "cache-control": "no-cache, no-store, max-age=0, must-revalidate", "date": "Sun, 05 Jun 2011 13:14:52 GMT", "x-frame-options": "SAMEORIGIN", "content-type": "application/json; charset=UTF-8"}, "original-encoding": "iso-8859-1", "content": "{n "kind": "urlshortener#url",n "id": "http://goo.gl/45cs",n "longUrl": "http://developer.android.com/guide/practices/ui_guidelines/icon_design.html"n}n"})
  

Что мне нужно сделать, чтобы исправить это?

PS: Я удалил свой ключ API из кода, чтобы сделать его общедоступным, в моем тесте ключ API есть, и он правильный, поскольку я могу увидеть действительный JSON, если я нажму на fetch:1 в отладчике Safari

Комментарии:

1. Ответ показывает, что вы на самом деле используете JSONP , который вам не следует анализировать, но позвольте вставленному скрипту вызвать функцию обратного вызова, которая анализирует параметр. Это необходимо, потому что вы не можете выполнить междоменный запрос XMLHttpRequest.

2. @Marcel: Но как я могу это сделать?

Ответ №1:

Вы забыли указать метод, который использует прокси (в данном случае: jsonlib.com ) следует использовать для POST , как того требует goo.gl API.

Просматривая документацию JSONlib, вы должны предоставить другое свойство в объекте parameter, method например:

 jsonlib.fetch({
    url: 'https://www.googleapis.com/urlshortener/v1/url',
    header: 'Content-Type: application/json',
    method: 'POST',
    data: JSON.stringify({longUrl: url})
}, function (m) {
    /* … */
});
  

Теперь m.content содержит

 '{ "kind": "urlshortener#url", "id": "http://goo.gl/ysEOJ", "longUrl": "http://tobyho.com/Trampolines_in_Javascript_and_the_Quest_for_Fewer_Nested_Callbacks" }'
  

которая является полностью допустимой строкой JSON.