JSONP - ошибки Access-Control-Allow-Origin и MIME - PullRequest
4 голосов
/ 19 ноября 2010

Я пытаюсь создать как серверную, так и клиентскую сторону запроса jsonp, и я не могу заставить его работать. Я просмотрел многочисленные руководства, посты в блогах и т. Д., Но почти все показывают только клиентскую часть.

Вот мой код клиента

$.ajax({
    dataType: 'application/json',
    data: params,
    jsonp: 'jsonpCallback',
    url: settings.domain + '/httpext.dll?json_cc',
    success: function (data) {
        //determine the return status
    },
    error: function (response, status, error) {
        //error handling
    }
}); //end ajax

прямо сейчас сервер возвращает жестко закодированное значение, подобное этому

jsonpCallback({"username":"meltingice","posts"1234});

Моя проблема в том, что я не могу получить запрос и ответ для совместной работы. В настоящее время ответ возвращает application / json, поэтому, если я изменю свой запрос, я ожидаю, что jsonp вернет ошибки с

Ресурс интерпретируется как скрипт, но передается с приложением типа MIME / json. Uncaught ReferenceError: jsonpCallback не определен

Прежде всего, как вы видите, у меня определен jsonpCallback.

Теперь, если я изменю dataType на application / json, я получу эту ошибку

XMLHttpRequest cannot load http://myserver/httpext.dll?json_cc&sid=adsfhasjdkfhajksdghjk%3Basdhg&action=SALE&ccCard=&ccNum=&ccExMM=0&ccExYYYY=0&ccCVV2=&holdersName=&totalDue=0&dueDate=11%2F19%2F2010. Origin http://localhost:59905 is not allowed by Access-Control-Allow-Origin.

Как видите, он не помещает callback=? в URL. Это довольно расстраивает.

Как настроить серверную часть, чтобы я мог вызывать ее с помощью jsonp? Что мне нужно для типа ответа? Как мне отформатировать возвращенные данные, чтобы мой код на стороне клиента мог получить данные обратно?

Ответы [ 2 ]

5 голосов
/ 19 ноября 2010

Причина, по которой это не работает, заключается в том, что ваш сервер всегда возвращает жестко закодированное имя метода, а ваш клиент использует анонимный обработчик success. Это не может работать. Вам необходимо настроить сервер на использование имени метода, переданного в качестве аргумента, иначе он никогда не вызовет обратный вызов success на клиенте. Поэтому, когда вы настроите свой сервер для учета параметра запроса jsoncallback, вы можете проверить его следующим образом:

$.getJSON(settings.domain + '/httpext.dll?json_cc&jsoncallback=?', params, function(result) {
    alert('success');
});

Теперь сервер получит запрос, который может выглядеть следующим образом:

http://foo.com/httpext.dll?json_cc&jsoncallback=jsonp1290183992345

и он должен ответить так:

jsonp1290183992345({"username":"meltingice","posts"1234});

с правильным Content-Type, а также, очевидно, (application/json).

1 голос
/ 18 января 2011

Я также хотел добавить этот фрагмент, который я использовал в ASP.NET MVC для обработки jsoncallback.

    private static ActionResult GetContent(object data, string callback)
    {
        if (!string.IsNullOrEmpty(callback))
        {
            ContentResult result = new ContentResult();
            result.ContentType = "application/json";

            JavaScriptSerializer serializer = new JavaScriptSerializer();
            string json = serializer.Serialize(data);
            result.Content = string.Format("{0}({1})", callback, json);
            return result;
        }
        else
        {
            JsonResult result = new JsonResult();
            result.Data = data;
            result.JsonRequestBehavior = JsonRequestBehavior.AllowGet;
            return result;
        }
    }
...