JSON Feed Появляется XHR, когда должно быть JS - PullRequest
0 голосов
/ 16 марта 2010

Я не понимаю, почему он делал это со вторым фидом (он выглядит как вызов XHR, а не просто JS [смотрит на это в Firefox / Firebug]). Второй канал имеет тот же тип MIME, что и канал Flickr JSON, но PortlandOregon.gov показывает как XHR, и я получаю обратный вызов NULL при использовании $ .getJSON и если я использую $ .ajax с json или jsonp типа я вообще ничего не получаю. Если я делаю Flickr один, я получаю нормальный обратный вызов «[Object Object]».

Что происходит? Пожалуйста помоги! Это была такая головная боль в течение недели. И у меня есть разрешение на изменение канала, но я должен запросить изменение, поэтому, если кто-то знает наверняка, сообщите мне об этом!

Заголовки ответа от Flickr API (http://api.flickr.com/services/feeds/photos_public.gne?tags=cat&tagmode=any&format=json&jsoncallback=?) [JS]:

Date    Mon, 15 Mar 2010 21:56:06 GMT
P3P policyref="http://p3p.yahoo.com/w3c/p3p.xml", CP="CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE GOV"
Expires Mon, 26 Jul 1997 05:00:00 GMT
Last-Modified   Mon, 15 Mar 2010 21:52:17 GMT
Cache-Control   no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma  no-cache
Vary    Accept-Encoding
Content-Encoding    gzip
Content-Length  3647
Connection  close
Content-Type    application/x-javascript; charset=utf-8
Request Headers
Host    api.flickr.com
User-Agent  Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.2) Gecko/20100115 Firefox/3.6
Accept  */*
Accept-Language en-us,en;q=0.5
Accept-Encoding gzip,deflate
Accept-Charset  ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive  115
Connection  keep-alive
Referer http://oscargodson.com/dev/addWidget/test.html
Cookie  BX=4lflj455amesp&b=3&s=iv; fltoto=0%2C0%2C0%2C0%2C1%2C0%3B0%2C0%2C0%2C0%2C0%2C0%2C0%2C0%2C0%2C0%2C0%2C0%2C0%3B1%3B0%3B; search_z=t; localization=en-us%3Bus%3Bus

PortlandOregon.gov (http://www.portlandonline.com/shared/cfm/json.cfm?c=27321) [XHR]:

Response Headers
Connection  close
Date    Mon, 15 Mar 2010 21:57:49 GMT
Server  Microsoft-IIS/6.0
Set-Cookie  CONTACT_ID=0;path=/ LAST_USER=;path=/ BIGipServercgis_pol_web_pool-http=1191537418.20480.0000; path=/
Content-Type    application/x-javascript; charset=utf-8
Request Headers
Host    www.portlandonline.com
User-Agent  Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.2) Gecko/20100115 Firefox/3.6
Accept  application/json, text/javascript, */*
Accept-Language en-us,en;q=0.5
Accept-Encoding gzip,deflate
Accept-Charset  ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive  115
Connection  keep-alive
Referer http://oscargodson.com/dev/addWidget/test.html
Origin  http://oscargodson.com

1 Ответ

1 голос
/ 16 марта 2010

Чтобы другие могли отправлять запросы jsonp, вам нужно проверить сервер, если в URL-адресе запроса есть параметр callback.

например.

/shared/cfm/json.cfm?callback=foo&c=27321

(обратите внимание, что foo - это просто пример, это может быть строка любого типа, например, jQuery использует что-то вроде callback=jsonp1231313123)

Если да, то вместо этого

( {"COLUMNS": ...... } )

тогда вам нужно это вернуть (значение параметра обратного вызова должно быть добавлено перед ответами)

foo( {"COLUMNS": ...... } )

Теперь вы сможете получить ответ либо, используя

$.ajax и datatype: 'jsonp' или

$.getJson("http://www.port.../json.cfm?callback=?", {c:'27321'}, somefn)


Как я могу сказать это ... Ну, проблемы, которые вы пришли из-за того, что вы не внимательно прочитали то, что я написал. И (может быть?) Не удосужился прочитать отрывки из документации jQuery API для $.ajax и $.getJSON, где написано что-то о jsonp.

  1. Данные http://www.portlandonline.com/shared/cfm/json.cfm?c=27321&callback=test по-прежнему неверны (function и return ключевое слово по-прежнему присутствует)
  2. Данные, которые возвращает ваш URL http://kneedeepincode.com/api/test/, в порядке. По крайней мере, в некотором смысле (вы не уважаете параметр обратного вызова и всегда возвращаете, как если бы был установлен callback=test. Но это нормально для тестирования. Но вносит небольшую ошибку, которая заставляет вас думать, что он не работает.

    • Причина, по которой вы думаете, что даже ваш тестовый сайт не работает, заключается в том, что вы неправильно его называете. (Перейдите к концу ответа, чтобы увидеть фрагмент кода, который прекрасно загружает ваш код.

Посмотрим, что я написал выше:

Либо использовать:

$.ajax и datatype: 'jsonp' или используйте

$.getJson и добавьте callback=? к URL (! НЕ callback=test).

Но на вашем тестовом сайте вы добавляете callback=test вместо callback=? к URL и используете $.getJSON. Это не сработает, так как в документации очень четко указано, что вы должны делать, когда вы используете $.getJSON и хотите действительно сделать запрос jsonp.

Если URL содержит строку "callback=?" в URL, запрос вместо этого обрабатывается как JSONP. Увидеть обсуждение типа данных jsonp в $. Ajax () для более подробной информации.

Когда вы установите callback=test, jQuery не распознает, что вы не хотите jsonp-запрос вместо json-запроса, и, таким образом, не может выполнить то, что ожидал, что он сделает. И просто обрабатывает отправляет callback = test, как если бы это был обычный параметр запроса get, а не обратный вызов jsonp.

Если вы используете $.ajax и datatype: 'jsonp', jQuery автоматически добавит callback=jsonp[somenumberhere] к URL.

Если вы хотите использовать $.getJson, вам нужно добавить callback=? к URL (но я повторяю ! НЕ callback=test. JQuery снова обработает замену ? на значение в виде jsonp[somenumberhere]).

Фрагмент рабочего кода для вашего тестового сайта:

$(document).ready(function() {
    $.ajax({
        url          : "http://kneedeepincode.com/api/test/",
        dataType     : 'jsonp',
        //normally you wouldn't set the jsonpCallback parameter
        //here I need to do this because your test site acts as if callback=test was set
        jsonpCallback: 'test',
        success      : function(data) {
            $("body").empty();
                for(var i = 0; i < data.COLUMNS.length; i++) {
                $("body").append("<p>"+data.COLUMNS[i]+"</p>");
            }
        }
    });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...