проблемы разбора дневной жизни JSON с JQuery - PullRequest

Ответы [ 2 ]

1 голос
/ 04 июля 2010

Не похоже, что daylife.com предоставляет "jsonp" в качестве типа возврата. Это означает, что объект javascript в теле тега script приведет к ошибке в браузере. И из-за этого, насколько я знаю, вы не сможете получить доступ к данным внутри тега сценария.

Если бы они поддерживали jsonp, они смотрели бы этот URL обратного вызова и возвращали бы что-то вроде следующего:

<script src="your API call here">
callbackFunction({response:"ok", data:[1,2,3]}) //this passes the data to callbackFunction
</script>

Вместо этого они возвращают это:

<script src="your API call here">
{response:"ok", data:[1,2,3]} //this is a parse error for the browser
</script>

Обходной путь - прокси-вызовы через ваш сервер к их серверу. Ниже приведен пример того, как это можно сделать на C #. Метод ProxyHandler просто иллюстрирует, как ProxyJsonpRequest может использоваться из некоторой веб-инфраструктуры. Это не имеет в виду конкретного. Идея состоит в том, что клиент javascript будет передавать параметр, который указывает удаленный URL, к которому сервер должен запрашивать данные. Сервер делает этот запрос и возвращает эти данные клиенту. Код ниже также работает только для запросов GET.

public string ProxyJsonpRequest(string remoteServer)
{
    HttpWebRequest req = HttpWebRequest.Create(remoteServer) as HttpWebRequest;
    HttpWebResponse resp = req.GetResponse() as HttpWebResponse;
    return new StreamReader(resp.GetResponseStream()).ReadToEnd();
}

public void ProxyHandler()
{
    string remote = this.Request.Params["url"];
    return new Response(data:ProxyJsonpRequest(remote), ContentType:"text/javascript");
}
0 голосов
/ 04 июля 2010

Ну, текст JSON просто содержит большой старый объект javascript, поэтому он называется «JavaScript Object Notation», поэтому вы можете получить любое свойство с его полным именем (например, object.property). Читая ответ JSON, предположим, что вы хотите получить "name", "url", "headline", "timestamp" и "excerpt" для каждого объекта в массиве "article":

$.getJSON("http://freeapi.daylife.com/jsonrest/publicapi/4.8/topic_getRelatedArticles?topic_id=&name=business&start_time=2010-06-26&end_time=2010-07-03&sort=date&offset=&limit=10&source_filter_id=&include_scores=&include_image=&include_redundant=&accesskey=b030265d4c2b33652b6d519a10d0a6f0&signature=c683ddf5dee41d321b673fb1413f1f5c&callback=?", function(data){
       $.each(data.response.payload.article, function(index, value){
            alert("The name: "+ value.source.name);
            alert("The url: "+ value.source.url);
            alert("The headline: "+ value.headline);
            alert("The timestamp: "+ value.timestamp);
            alert("The excerpt: "+ value.excerpt);
         });
     });

Обратите внимание на параметр callback в строке запроса, то есть должен , если вы будете использовать этот код из любого домена, выходящего из daylife.com, потому что одна и та же политика происхождения, применяемая большинством браузеров, не позволяет вам делать подобные вызовы, потому что внедрение кода javascript с одной страницы на другую - это страшная и опасная вещь, поэтому вы используете параметр обратного вызова, чтобы сказать браузеру «расслабить человека, Я знаю, что я здесь делаю "

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...