gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 23:58:42 25 4
gpt4 key购买 nike

我想使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com