jquery - 如果 ContentType 不是 JSON,我可以从 .asmx Web 服务返回 JSON 吗?

标签 jquery web-services json response.contenttype

我想使用 ajax 和 jquery 将表单发布到 .asmx Web 服务,并以 JSON 形式从 Web 服务返回值。

我正在使用 ASP.NET 4.0。我知道为了从 Web 服务返回 JSON,需要设置以下内容 (1) dataType: "json"(2) contentType: "application/json; charset=utf-8", (3) type: "POST"(4) 将Data 设置为某项。我已经对此进行了测试,它工作正常(即我的网络服务以 JSON 形式返回数据)如果所有 **四个 均已设置**。

但是,就我而言,我想做一个标准表单帖子,即 test1=value1&test2=value2 所以 contentType 不是 JSON,但我想要返回 JSON {test1:value1}。这似乎不起作用,因为 contentType 是“application/x-www-form-urlencoded”而不是“application/json; charset=utf-8”。

谁能告诉我为什么我不能这样做?对我来说这似乎很疯狂,你必须明确地 发送 JSON 以获取 JSON,但如果您不使用 JSON(即后 urlencoded 内容类型),则 Web 服务将返回 XML。

非常感谢任何见解:)

最佳答案

如果您将使用 WFC RESTfull 服务而不是 .asmx webservice,您可以实现问题中的所有要求。但是使用带有 JSON 作为输出的 .asmx Web 服务要求,您至少使用 contentType: 'application/json'。在不同的地方,您可以找到一个原因 - 安全原因(请参阅 JSON 劫持)。

可能“x-www-form-urlencoded”不是您真正的问题。如果您使用 dataType: "json" 参数也将以“test1=value1&test2=value2”的形式发送!唯一的区别是所有值都应该采用 JSON 编码。并且 jQuery 不会对数据进行 JSON 编码。 (你可以查看jQuery的代码。)主要区别只是“Accept:application/json”将在请求 header 中显式设置。

看看JQuery ajax call to httpget webmethod (c#) not working我最近写的。在这篇文章中询问了 GET 请求的示例。但几乎是一样的。唯一的区别是,编码后的数据将附加到 URL 中(对于 GET 请求)。对于 POST 请求,数据将在正文中发送。顺便说一句,如果设置“processData: false”(请参阅​​ http://api.jquery.com/jQuery.ajax/ ),GET 数据也将发送到正文内部。因此,请阅读我的代码示例 JQuery ajax call to httpget webmethod (c#) not working 。我希望您能收到如何实现您的愿望的想法。

我认为您在为 .asmx Web 服务调用编码复杂数据时遇到了问题。这是“复杂”数据的示例:

[WebMethod]
[ScriptMethod (UseHttpGet = true, ResponseFormat = ResponseFormat.Json)]
public OutputData AjaxGetMore (InputData input) {
    return new OutputData () {
        id = input.id,
        message = new List { "it's work!", "OK!" },
        myInt = new int[] { input.myInt[0] + 1, input.myInt[1] + 1, 20, 75 },
        myComplexData = new InternalData () { blaBla = "haha", iii = new int[] { 1, 2, 3, 4, 5 } }
    };
}

哪里

public class InternalData {
    public string blaBla { get; set; }
    public int[] iii { get; set; }
}
public class OutputData {
    public string id { get; set; }
    public List message { get; set; }
    public int[] myInt { get; set; }
    public InternalData myComplexData { get; set; }
}
public class InputData {
    public string id { get; set; }
    public int[] myInt { get; set; }
    public InternalData data { get; set; }
}

在客户端

var myData = { id: "li1234", myInt: [100, 200], data : {blaBla: "Hahhh!", iii: [10,20,30]}}
var myDataForjQuery = {input:$.toJSON(myData)};
$.ajax({
    type: "GET",
    url: "/Service1.asmx/AjaxGetMore", // + idAsJson,
    data: myDataForjQuery, // idAsJson, //myData,
    dataType: "json",
    contentType: "application/json; charset=utf-8",
    success: function(msg) {
        // var msg = {__type: "Testportal.outputData", id: "li1234", message: "it's work!", myInt:101}
        alert("message=" + msg.d.message + ", id=" + msg.d.id + ", myInt=" + msg.d.myInt); 
    },
    error: function(res, status) {
        if (status ==="error") {
            // errorMessage can be an object with 3 string properties: ExceptionType, Message and StackTrace
            var errorMessage = $.parseJSON(res.responseText);
            alert(errorMessage.Message);
        }
    }
});

($.toJSON 来自 JSON 插件) 如果需要,您可以将此示例修改为 HTTP POST。

还有一个小建议。如果您使用 jQuery 1.4.x,您可以尝试使用“none”作为数据类型。请参阅文档:“如果未指定,jQuery 将根据响应的 MIME 类型智能地尝试获取结果(XML MIME 类型将生成 XML,在 1.4 JSON 中将生成 JavaScript 对象,在 1.4 脚本中将执行脚本,其他任何内容都将作为字符串返回)”

致以诚挚的问候

关于jquery - 如果 ContentType 不是 JSON,我可以从 .asmx Web 服务返回 JSON 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2670147/

相关文章:

javascript - 如何检测 .html() 函数在 jQuery 中被调用?

javascript - 我可以在同一个插件中添加这段代码吗

php - iPhone Web服务NSData和PHP

json - 如何在JSON文件中格式化带有三引号的多行字符串?

javascript - 在浏览器中查看 WordPress 插件请求的数据?

javascript - node.js 将相对路径字符串添加到数组会复制斜杠

javascript - jQuery 查询生成器 - 无法使其工作 - 未捕获的 TypeError : Cannot set property 'extendext' of undefined

javascript - 如何用另一个 javascript src 调用一个 javascript 外部 src?

java - 如何处理从网络服务上传文件

web-services - 创建 RESTful 复杂查询的最佳方法是什么?