JQuery и XHR - кросс-сайт JSON POST с CORS

Я делаю небольшой пользовательский интерфейс для отправки объекта JSON на внешний сервер CastIron (не то, чтобы тип сервера важен для этого вопроса) с помощью jQuery. Начальная отправка работает нормально, но я не получаю ответ от сервера. Вот как выглядит jQuery:

$.ajax({
        url: 'http://cirun2/Impact/CreateImpacts',
        type: "POST",
        data: JSON.stringify(myobj),
        dataType: 'text',
        async: false,
        //beforeSend: function(xhr){
        //      xhr.setRequestHeader(
        //},
        complete: function(returned_data) {
                $('#output').append("<p>Submitted successfully to CastIron. Returned data: " + returned_data + "</p>");
        },
        error: function(error_text) {
                console.log("Update unsuccessful. Status: ", error_text);
        }
});

Я получаю "Успешно отправлено в CastIron. Возвращенные данные: [объект объекта]'сообщение, но оно не отображает текст, и firebug указывает, что есть ошибка.

Ответ Firebug

И вот полная ошибка:

"[Exception..." Failure "nsresult:" 0x80004005 (NS_ERROR_FAILURE) "location:" JS frame:: http://server.company.com/mr/js/jquery-1.11.0.min.js::. отправить:: строка 4"данные: нет]"

Часть после 200 - это объект JSON, который я ожидаю в качестве ответа. Я не уверен, как добраться до этого. Часть после 'Via' является заголовком CastIron по умолчанию, показывающим, сколько времени занимает каждый процесс. Я не уверен, что они выдаются в неправильном порядке, или в чем проблема.

РЕДАКТИРОВАТЬ (7 мая 2014 года): я сделал еще несколько возни, и я думаю, что я пропустил важную часть информации. Я пытаюсь использовать CORS. Вот мои заголовки. Возможно ли, что заголовки верны для отправки, но не верны для возвращаемого значения?

Response Headers
Access-Control-Allow-Head...    X-Requested-With
Access-Control-Allow-Orig...    *
Connection  keep-alive
Content-Length  288
Content-Type    application/json; charset=utf-8
Date    Wed, 07 May 2014 14:34:51 GMT
X-Powered-By    Express

Request Headers
Accept  application/json, text/javascript, */*; q=0.01
Accept-Encoding gzip, deflate
Accept-Language en-US,en;q=0.5
Host    myserver.mycompany.com:4000
Origin  http://ironsides.zayo.com
User-Agent  Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:28.0) Gecko/20100101 Firefox/28.0

3 ответа

Решение

Это привело к неправильным заголовкам с сервера CastIron. Я заставил администратора CI исправить код возврата на "200 OK", и она добавила следующие заголовки:

Access-Control-Allow-Origin: *    
Access-Control-Allow-Headers: X-Requested-With

Оказывается, ее ответ не посылал эти заголовки. После прочтения CORS и отладки CORS в Firebug я смог понять это.

Попробуйте это (шаблон)

обновленный

$(function () {
    var callback = function (results) {    
        $("#output")
        .append("<p>Submitted successfully to server. Returned data: " 
        + JSON.stringify(results.caseURL) + "</p>")    
    };
    var myobj = {
        "caseURL": {
            "caseURL": "https://cs18.salesforce.com/50060000008ugtSAAQ"
        }
    };

    var request = $.ajax({
        url: "/echo/json/",
        data: {
            json: JSON.stringify(myobj)
        },
        type: "POST",
        dataType: "json"
    });
    request.done(function (data, textStatus, jqxhr) {
        if (textStatus === "success" && jqxhr.responseJSON) {
            console.log(data, jqxhr.responseJSON, jqxhr.responseText);
            if (data.hasOwnProperty("caseURL")) {
                callback(data)
            };
        };
    });
    request.fail(function (jqxhr, textStatus, error_text) {
        if (textStatus != "success") {
            console.log("Update unsuccessful. Status: ", error_text, 
            textStatus, jqxhr.getAllResponseHeaders());
        };
    });
})

обновленный jsfiddle

увидеть

http://doc.jsfiddle.net/use/echo.html

http://api.jquery.com/jQuery.ajax/ (data, dataFilter, processData)

http://api.jquery.com/jQuery.ajax/

Тип содержимого запроса POST ограничен application/x-www-form-urlencoded, multipart/form-data или text/plain для CORS.

https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS

Смотрите "Примеры сценариев контроля доступа">"Простые запросы"

Пожалуйста, поправьте меня, если ошибаетесь.

Другие вопросы по тегам