我有一个需要POST请求并返回一些JSON的页面。基本上它是一个.ashx页面,但这并不重要。
使用jQuery时,我会使用带有“json”的jQuery.Post作为dataType来简单地发出POST请求并获取一个对象。但是,对于当前项目,我主要使用ASP.net AJAX,我不想仅为调用添加jQuery。
对于ASP.net AJAX,我只找到了有关如何调用“传统”Web服务的信息,这意味着将asp:ServiceReference添加到ScriptManager并在最后使用“真正的”Web服务。
是否有更简单的方法对页面进行POST调用?我可以忍受获取原始JSON,然后手动eval(),但我不想创建一个完整的asmx Web服务(在SharePoint上部署它们有点痛苦,我的ashx处理程序工作正常)
答案 0 :(得分:2)
Sys.Net.WebServiceProxy.invoke(url,methodName,useGet,parametersDictionary,onSuccess,onFailure,userContext,timeout);
除第一个之外,所有参数都是可选的。
parametersDictionary就像{foo:bar} - 如果要发布,参数将作为JSON发送到正文中,如果是GET则作为查询字符串的参数发送(每个参数单独json序列化 - 哪个btw意味着字符串看起来像“foo”,带引号)。
onSuccess,如果回调将数据作为第一个参数(已经反序列化的对象)。
onFailure获取一个错误对象作为第一个参数,其中包含get_message()方法以获取错误消息,以及其他一些内容。
答案 1 :(得分:1)
您可以直接使用invoke类的Sys.Net.WebServiceProxy方法。
方法签名如下所示:
invoke(path, methodName, useHttpGet, parameters, succeededCallback, failedCallback, userContext, timeout);
假设您的服务实际返回JSON,那么 succeededCallback 的第一个参数应该是JSON对象。
答案 2 :(得分:0)
Sys.Net.WebServiceProxy没有帮助,因为它似乎期望最终真正的Web服务 - Request.Form在服务器端是空的,parametersDictionary似乎被忽略。似乎没有覆盖来连接另一个执行者。
我现在通过手动创建Sys.Net.WebRequest来解决它。我将看看jQuery源代码,因为这种方法更加复杂/“裸机”,但如上所述,如果不需要,我不想在jQuery上添加依赖项。 / p>
var ApplicationFunctions = {
showDialog: function(someParam, someOtherParam) {
var sb = new Sys.StringBuilder("Do you really want to do '");
sb.append(someParam);
sb.append("' ?");
var msg = sb.toString();
if (confirm(msg)) {
var myWebRequest = new Sys.Net.WebRequest();
myWebRequest.set_url('SomeService.ashx');
myWebRequest.set_httpVerb('POST');
// Manually build POST body. This would need escaping/urlencoding
// I think if I couldn't guarantee that the parameters are 'clean'
var bodySb = new Sys.StringBuilder("postParam=");
bodySb.append(someParam);
bodySb.append("&anotherPostParam=");
bodySb.append(someOtherParam);
var body = bodySb.toString();
myWebRequest.set_body(body);
myWebRequest.get_headers()["Content-Length"] = body.length;
// also check out usercontext to pass additional data into the completed function
// http://msdn.microsoft.com/en-us/library/bb397436.aspx
myWebRequest.add_completed(ApplicationFunctions.onCallCompleted);
myWebRequest.set_timeout(10 * 1000); // 10 seconds
myWebRequest.invoke();
}
},
onCallCompleted: function(response) {
if (response.get_timedOut()) {
alert("Timed Out!");
return;
}
if (response.get_statusCode() !== 200) {
alert("Status Code not OK");
return;
}
if (!response.get_responseAvailable()) {
alert("No data available?!");
return;
}
// Better use a JSON parser
// http://www.json.org/js.html
var responseData = eval('(' + response.get_responseData() + ')');
alert("Success: " + responseData.SomeField);
}
}