jQuery中通过ajax调用webservice传递数组参数的问题实例详解

下面通过实例给大家说明比较直观些,更方便大家了解。

本人的项目中通过jquery.ajax调用webservice.

客户端代码如下:

$.ajax({
url: "test/xxx.asmx",
type: 'POST',
dataType: 'xml',
timeout: ,
data: { name: "zhangsan", tags: ["aa", "bb", "cc"] },
error: function(xml) {
alert(xml.responseText);
},
success: function(xml) {
alert("OK");
}
}); 

服务端代码如下:

[WebMethod]
public XmlDocument xxx(string name, string [] tags )
{
return sth;
}

总是抛出异常.

问题出现在这里:

下面是HTTP数据:

POST http://xxx.com/xxx.asmx/xxx HTTP/1.1
Host: center.cmis.htpc.com.cn
Connection: keep-alive
Content-Length: 55
Cache-Control: max-age=0
Origin: http://xxx.com
User-Agent: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.186 Safari/535.1
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Accept: application/xml, text/xml, */*; q=0.01
Referer: http://xxx.com/xxx.aspx
Accept-Encoding: gzip,deflate,sdch
Accept-Language: zh-CN,zh;q=0.8
Accept-Charset: GBK,utf-8;q=0.7,*;q=0.3
name=zhangsan&tags%5B%5D=aa&tags%5B%5D=bb&tags%5B%5D=cc

而它期望的格式是如下的:

POST /xxx.asmx/xxx HTTP/1.1
Host: xxx.com
Content-Type: application/x-www-form-urlencoded
Content-Length: length
name=string&tags=string&tags=string

比较上面粗体,post的数据除了问题. 正确的应该如下:

name=zhangsan&tags=aa&tags=bb&tags=cc

看来问题出在jquery.ajax上面了.见代码(jquery.1.8.3.js)

function buildParams(prefix, obj, traditional, add) {
var name;
if (jQuery.isArray(obj)) {
// Serialize array item.
jQuery.each(obj, function(i, v) {
if (traditional || rbracket.test(prefix)) {
// Treat each array item as a scalar.
add(prefix, v);
} else {
// If array item is non-scalar (array or object), encode its
// numeric index to resolve deserialization ambiguity issues.
// Note that rack (as of ..) can't currently deserialize
// nested arrays properly, and attempting to do so may cause
// a server error. Possible fixes are to modify rack's
// deserialization algorithm or to provide an option or flag
// to force array serialization to be shallow.
//ytx
buildParams(prefix, v, traditional, add);
//buildParams(prefix + "[" + (typeof v === "object" ? i : "") + "]", v, traditional, add);
}
});
} else if (!traditional && jQuery.type(obj) === "object") {
// Serialize object item.
for (name in obj) {
buildParams(prefix + "[" + name + "]", obj[name], traditional, add);
}
} else {
// Serialize scalar item.
add(prefix, obj);
}
}

结论:

出问题的代码在22行,我修改成21行那样就行了.

不过,我对js/jquery都是一知半解的,希望不要引起别的后遗症,呵呵.

以上所述是小编给大家介绍的jQuery中通过ajax调用webservice传递数组参数的问题实例详解的相关知识,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

时间: 2016-05-18

jQuery.ajax向后台传递数组问题的解决方法

今天重温了一个问题,jQuery.ajax向后台传递一个数组,而在后台接收不到该值. 前台js方法部分代码如下: //创建一个测试数组 var boxIds = new Array(); boxIds.push(12182); boxIds.push(12183); boxIds.push(12184); //向后台交互 $.ajax({ url: "/xxx", type: "GET", data: { "boxIds": boxIds, &q

jquery ajax 向后台传递数组参数示例

需求: 在JS中向后台传递数组参数 分析: JS中的数组是弱类型的可以放任何类型(对象.基本类型),但是如果数组中放的是对象类型,传递到后台是显示的只能是对象字符串--[object Object],原因如下: 在后台接收的时候,只能用request来接收,request.getParameterValues()方法返回的是一个String[],所以,应该是在前台传输的时候调用了对象的toString()方法,那么如果依然想传递对象怎么办?凉拌! 但是可以使用JSON字符串来实现,在后台把JSO

利用ajax传递数组及后台接收的方法详解

前言 我们在使用ajax异步的提交多选框得到需要操作的对象的id,这时我们可以把每一个id做出一个对象,之后放到一个数组中,再使用JSON.stringify()对这个数组进行json的格式化:在后台中再inputStream中解析出我们的json字符串,之后只用: new JSONArray()得到json数组,循环解析我们想要的属性: var countsCheckBox = $("input[type='checkbox']:checked"); var booksid = []

shell 使用数组作为函数参数的方法(详解)

因工作需要,需要使用shell开发一些小工具,当使用数组作为函数参数时,发现只能传递数组的第一个元素,数组后面的元素不能传递到函数内. #!/bin/bash function showArr(){ arr=$1 for i in ${arr[*]}; do echo $i done } regions=("GZ" "SH" "BJ") showArr $regions exit 0 把代码保存为test.sh后执行,只输出了第一个元素. ./t

对python numpy数组中冒号的使用方法详解

python中冒号实际上有两个意思:1.默认全部选择:2. 指定范围. 下面看例子 定义数组 X=array([[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16],[17,18,19,20]]) 输出为5x4二维数组 第一种意思,默认全部选择: 如,X[:,0]就是取矩阵X的所有行的第0列的元素,X[:,1] 就是取所有行的第1列的元素 第二种意思,指定范围,注意这里含左不含右 如,X[:, m:n]即取矩阵X的所有行中的的第m到n-1列数据,含左不含右

利用win10自带虚拟机hyper-v安装centos7方法详解

一.安装win10企业版自带虚拟机 hyper-v 1.控制面板-->程序和功能-->启用或关闭Windows功能 勾上 hyper-v 确定就ok了 2.安装成功后会发现在 左下角"开始"菜单里的"Windows 管理工具" 中出现"hyper-v管理器" 打开hyper-v管理器,首先新建"虚拟交换机" 以便虚拟系统访问网络. 虚拟交换机 创建完成后,接下来我们创建 虚拟机. 这边根据需要选择第一代还是第二代.

php实现将二维关联数组转换成字符串的方法详解

本文实例讲述了php实现将二维关联数组转换成字符串的方法.分享给大家供大家参考,具体如下: 需求 项目中遇到了二维关联数组转字符串的问题,查阅相关资料,写了如下程序,并且能过滤重复的关键字. 举例,php的二维数组如下: $name = array( "self" => "wangzhengyi", "student" => array( "chenshan", "xiaolingang" ),

Java实现数组去除重复数据的方法详解

本文实例讲述了Java实现数组去除重复数据的方法.分享给大家供大家参考,具体如下: 前一段时间被面试问到:如果一个数组中有重复元素,用什么方法可以去重?一时间会想到用一种方法,但是后来查阅资料后发现,有好多方法可以实现,现在就总结一下,比较简单的几种. 一.用List集合实现 int[] str = {5, 6, 6, 6, 8, 8, 7,4}; List<Integer> list = new ArrayList<Integer>(); for (int i=0; i<s

JS查找数组中重复元素的方法详解

本文实例讲述了JS查找数组中重复元素的方法.分享给大家供大家参考,具体如下: JS的数据类型有一个数组.今天我们就来谈谈对数组的一种处理.相信很多人都遇到过从数组中查找出不重复的元素,但是我遇到的却是从数组中查找出重复的元素. 从js数组中查找出不重复的元素的方法有很多,下面就给大家列举一个: <!DOCTYPE html> <html> <body> <script> Array.prototype.deleteEle=function(){ var ne

Android studio利用gradle打jar包并混淆的方法详解

本文主要介绍了Android studio利用gradle打jar包并混淆的方法,下面话不多说,来看看详细的介绍吧. 首先打jar包的配置很简单,使用jar的task,可以参考gradle官方文档,具体代码如下: task buildJar(type: Jar, dependsOn: ['assembleRelease']) { destinationDir = file('build/outputs/jar/') appendix = "" baseName = "&quo

利用Linux防火墙隔离本地欺骗地址的方法详解

前言 即便是被入侵检测和隔离系统所保护的远程网络,黑客们也在寻找各种精巧的方法入侵.IDS/IPS 不能停止或者减少那些想要接管你的网络控制权的黑客攻击.不恰当的配置允许攻击者绕过所有部署的安全措施. 在这篇文章中,我将会解释安全工程师或者系统管理员该怎样避免这些攻击. 几乎所有的 Linux 发行版都带着一个内建的防火墙来保护运行在 Linux 主机上的进程和应用程序.大多数防火墙都按照 IDS/IPS 解决方案设计,这样的设计的主要目的是检测和避免恶意包获取网络的进入权. Linux 防火墙

PHP利用二叉堆实现TopK-算法的方法详解

前言 在以往工作或者面试的时候常会碰到一个问题,如何实现海量TopN,就是在一个非常大的结果集里面快速找到最大的前10或前100个数,同时要保证内存和速度的效率,我们可能第一个想法就是利用排序,然后截取前10或前100,而排序对于量不是特别大的时候没有任何问题,但只要量特别大是根本不可能完成这个任务的,比如在一个数组或者文本文件里有几亿个数,这样是根本无法全部读入内存的,所以利用排序解决这个问题并不是最好的,所以我们这里就用php去实现一个小顶堆来解决这个问题. 二叉堆 二叉堆是一种特殊的堆,二