【问题标题】:openrasta xml request being returned as jsonopenrasta xml请求作为json返回
【发布时间】:2010-03-04 18:36:29
【问题描述】:

我有一个非常简单的 OpenRasta 应用程序,它的 Home 资源具有 Title 的单个字符串属性(直接来自 OpenRasta 社区文档示例)。

我已经为资源设置了 XML 和 JSON 数据合同,如下所示:

ResourceSpace.Has.ResourcesOfType<Home>()
    .AtUri("/home")
    .HandledBy<HomeHandler>()
    .AsXmlDataContract()
    .And.AsJsonDataContract();

通过 jQuery,我能够很好地获取 JSON 数据。但是,当我发出 jQuery XML Ajax 请求时,我会返回 JSON 数据。

我的 jQuery 代码如下所示:

$.ajax(
{
    url: "/home",
    dataType: "xml",
    success: function(result) {
        $('#xmlSpan').append($(result).find('Title').text());
    },
    error: function(request, status, ex) {
        $('#xmlSpan').append('error: ');
        $('#xmlSpan').append(status + ', ');
        $('#xmlSpan').append(ex.toString());
    }
});

被附加的错误信息最终看起来像这样:

error: parsererror, TypeError: a is null

但这是有趣的部分。来自 Fiddler,我的请求如下所示:

GET http://127.0.0.1:51041/home HTTP/1.1
Host: 127.0.0.1:51041
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.8) Gecko/20100202 Firefox/3.5.8
Accept: application/xml, text/xml, */*
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: 300
Connection: keep-alive
X-Requested-With: XMLHttpRequest
Referer: http://ipv4.fiddler:51041/WebForm1.aspx
Cache-Control: max-age=0

...我的回复是这样的:

HTTP/1.1 200 OK
Server: ASP.NET Development Server/9.0.0.0
Date: Thu, 04 Mar 2010 18:30:04 GMT
X-AspNet-Version: 2.0.50727
Content-Length: 18
Cache-Control: private
Content-Type: application/json; q=0.5
Connection: Close

{"Title":"Foooo!"}

我的请求以“接受:应用程序/xml”的形式出现,但响应是“应用程序/json”(并且返回的数据显然是 json)。

我做错了什么?

【问题讨论】:

    标签: json jquery openrasta


    【解决方案1】:

    迈克,

    (对不起,我之前没有看到这个问题)

    你没有做错什么,这应该可以正常工作。

    您的 Accept: 标头指定您的客户端乐于接收 application/xml 或其他任何内容 (/)。 OpenRasta 可能会假设“其他任何东西”都可以工作并使用 json 编解码器。

    如果您将标题更改为

    接受:application/xml, text/xml;q=0.9, /;q=0.8

    那你应该没事。或者,只需删除 / alltogether/

    也就是说,通常 / 在 openrasta 的内容协商算法中总是作为最后的手段,所以这个结果非常令人惊讶。您使用的是什么版本的 OR?

    【讨论】:

    • 这周我会研究这个。我刚从假期回来,我会在第一时间解决这个问题。感谢您的跟进。 -迈克
    • 这是我发现的……我下载了 OR (2.0.3214.437) 的最新候选版本,但仍然遇到同样的问题。正如您所建议的,我修改了我的 jQuery .ajax 调用以修改 Accept 标头,然后一切都开始工作: beforeSend: function(xhr) { xhr.setRequestHeader('Accept', 'application/xml, text/xml') } 理想情况下,我认为 jQuery 开发人员不必担心修改标头以使其正常工作。现在我知道解决方案很棒,但其他人可能会遇到这个问题。
    • 你说的很对,accept header应该是根据我认为的提交的内容类型自动设置的。我将填写一份关于 jQuery 的错误报告,说明它们没有正确地优先处理内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-23
    相关资源
    最近更新 更多