この記事では、例を使用して、ajax を介して Web サービスを呼び出して jQuery で配列パラメーターを渡すことに関する関連情報を詳しく紹介します。必要な方は参照してください。
次の例は、より直感的で誰にとっても理解しやすいものです。
私のプロジェクトでは、jquery.ajax を通じて Web サービスを呼び出します。
クライアント コードは次のとおりです:
$.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
上記の太字フォントと比較すると、正しい投稿データは次のようになります:
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); } }
以上が皆さんの参考になれば幸いです。
関連記事:
Ajaxを使用した配列転送とバックグラウンド受信の方法を詳しく解説
AJAXページング効果の実装は簡単(グラフィックチュートリアル)
以上がjQuery で Web サービスを呼び出す Ajax を介して配列パラメーターを渡す問題 (グラフィック チュートリアル)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。