当前位置: 58彩票app下载 > 关于计算机 > 正文

基于JQuery的访问WebService的代码(可访问Java[Xfir

时间:2019-09-18 11:14来源:关于计算机
本人留心看看了探问多少人的事例,发掘了难题。名闻遐迩WebService是遵从SOAP公约的,为何例子都以JSON格式的参数字传送递?netWebService包容JSON格式,而Java的是标准WebService,不包容JSON。

本人留心看看了探问多少人的事例,发掘了难题。名闻遐迩WebService是遵从SOAP公约的,为何例子都以JSON格式的参数字传送递?net WebService包容JSON格式,而Java的是标准WebService,不包容JSON。看来net害了豪门啊。于是自身稳重询问了WSDL文件,做了个例证。下边只放关键代码。

先是,因为JSON对于JS的便利性,考虑通过JSON来呼吁和重临数据。在JS中实例化一个xmlHttpRequest对象,然后依据网络的验证POST的地方为:asmx页面地址/Web方法名。在RequestHeader中安装Content-Type为application/json; charset=utf-8,SOAPAction设为Web方法名。Web方法的参数用JSON格式send出去。
代码如下:

复制代码 代码如下:

复制代码 代码如下:

$(function () {
$("#btnWs").click(btnAjaxPost);
});

function getXmlHttp() {
var xmlHttp;
if (window.XMLHttpRequest)
{ // code for IE7+, Firefox, Chrome, Opera, Safari
xmlHttp = new XMLHttpRequest();
}
else
{ // code for IE6, IE5
xmlHttp = new ActiveXObject('Microsoft.XMLHTTP');
}
return xmlHttp;
}
function webservice(url, action, data, success, error, complete, failed) {
var xmlHttp = getXmlHttp(); //获取XMLHttpRequest对象
xmlHttp.open('POST', url + '/' + action, true); //异步央求数据
xmlHttp.onreadystatechange = function () {
if (xmlHttp.readyState == 4) {
try {
if (xmlHttp.status == 200 && typeof (success) == 'function') {
success(xmlHttp.responseText);
}
else if ((xmlHttp.status / 100 == 4 || xmlHttp.status / 100 == 5) && typeof (error) == 'function') {
error(xmlHttp.responseText, xmlHttp.status);
}
else if (xmlHttp.status / 100 == 200 && typeof (complete) == 'function') {
complete(xmlHttp.responseText, xmlHttp.status);
}
else if (typeof (failed) == 'function') {
failed(xmlHttp.responseText, xmlHttp.status);
}
}
catch (e) {
}
}
}
xmlHttp.setRequestHeader('Content-Type', 'application/json; charset=utf-8');
xmlHttp.setRequestHeader('SOAPAction', action);
xmlHttp.send(data);
}

function btnAjaxPost(event) {
$.ajax({
type: "POST",
contentType:"text/xml",
url:"",
data:getPostData(),//这里不应当用JSON格式
dataType:'xml',//这里设成XML只怕不设。设成JSON格式会让重返值产生NULL
success: function(xml) {
//对结果做XML解析。
//浏览器剖断 (IE和非IE完全差异)
if($.browser.msie){
$("#result").append(xml.getElementsByTagName("ns1:out")[0].childNodes[0].nodeValue+"<br/>");
}
else{
$(xml).find("out").each(function(){
$("#result").append($(this).text()+"<br/>");
})
}
},
error: function(x, e) {
alert('error:'+x.responseText);
},
complete: function(x) {
//alert('complete:'+x.responseText);
}
});
}
//定义满意SOAP合同的参数。
function getPostData()
{
//依照WSDL分析sayHelloWorld是方法名,parameters是传播参数名
var postdata="<?xml version="1.0" encoding="utf-8"?>";
postdata+="<soap:Envelope xmlns:xsi="" xmlns:xsd="" xmlns:soap=";";
postdata+="<soap:Body><sayHelloWorld xmlns=";";
postdata+="<parameters>"+$("#txtName").val()+"</parameters>";
postdata+="</sayHelloWorld></soap:Body>";
postdata+="</soap:Envelope>";
return postdata;
}

举例说乞求调用Webservice第11中学的HelloWorld方法:

完全例子SVN地址:
本人后来全体学习的事例都会放在

复制代码 代码如下:

您恐怕感兴趣的稿子:

  • PHP调用JAVA的WebService轻松实例
  • python调用java的Webservice示例
  • Java调用WebService接口的措施
  • 基于JAVA中利用Axis宣布/调用Webservice的格局详解
  • Java编制程序中央银行使XFire框架调用WebService程序接口
  • Java访问Web瑟维斯重返XML数据的主意
  • php5 apache 2.2 webservice 成立与安排(java)
  • 行使CXF和Jersey框架来举行Java的WebService编程
  • C# 调用 JavaWebservice服务遭受的标题集聚
  • java完结轻松的webservice形式

webservice('/Webservice1.asmx','HelloWorld','{}',function (msg) { alert(msg); });

调用前请记得把Webservice1上边的 [System.Web.Script.Services.ScriptService] 裁撤注释,调用后得以看到弹出警告窗口:{"d": "Hello World"}。把Content-Type设为text/xml时,警告窗口的剧情变就成为了<?xml version="1.0" encoding="utf-8"?> <string xmlns=" World</string>。
此时即使参数“{}”仍然JSON的样式呼吁却是XML格式,但因为Hello World未有参数,所以忽略了剧情的格式,可以健康重返值。
设若退换服务端的HelloWorld方法,增多贰个string类型的参数somebody。

复制代码 代码如下:

[WebMethod]
public string HelloWorld(string somebody) {
return "Hello World&Hello, " + somebody + "!";
}

将央求端的Content-Type改回application/json,传送参数改为{"somebody": "Krime"},调用后弹出窗口内容变为{d: "Hello World&Hello, Krime!"}。
但万一此刻再平昔把Content-Type改为text/xml,调用后服务器将会报错:System.InvalidOperationException: 央求格式无效: text/xml; charset=UTF-8。 在 System.Web.瑟维斯s.Protocols.HttpServerProtocol.ReadParameters() 在 System.Web.Services.Protocols.WebServiceHandler.CoreProcessRequest()
于是乎大家把参数格式也修改一下,遵照Webservice调节和测量试验页面包车型地铁演示,将参数改为:

复制代码 代码如下:

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="" xmlns:xsd="" xmlns:soap=";
<soap:Body>
<HelloWorld xmlns=";
<somebody>Krime</somebody>
</HelloWorld>
</soap:Body>
</soap:Envelope>

与此相类似应该就能够平常重临XML的结果了呢?结果却奇怪,服务器照旧报一样的失实。
折腾了十分久后,大致要抓狂了,难道ASP.NET突然不认得XML了?这年,再重临细心看看Webservice调节和测量检验页面包车型客车亲自过问,终于意识了一点标题:

复制代码 代码如下:

POST /WebServiceTest/Webservice1.asmx HTTP/1.1
Host: localhost
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: ""
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="" xmlns:xsd="" xmlns:soap=";
<soap:Body>
<HelloWorld xmlns=";
<somebody>string</somebody>
</HelloWorld>
</soap:Body>
</soap:Envelope>

地点POST的地方前面并未像央求JSON数据时一样加上/方法名,而SOAPAction的点子名前边还供给丰硕命名空间。于是修改XMLHttpRequest的央浼头,url和action做相应修改,结果到底平常重返了XML的结果:<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="" xmlns:xsi="" xmlns:xsd=" xmlns=" World&Hello, Krime!</HelloWorldResult></HelloWorldResponse></soap:Body></soap:Envelope>
新兴持续测量试验,开掘呼吁内容类型为application/json时,SOAPAction完全能够忽略不加,不过url后边必然要抬高/方法名,不然服务器不会回来数据。而央求text/xml时,SOAPAction是必需的且前边要丰裕命名空间,url前面则无法有/方法名。
最后,经过总计,将代码改成了最终的模范:

复制代码 代码如下:

function getXmlHttp() {
var xmlHttp;
if (window.XMLHttpRequest)
{ // code for IE7+, Firefox, Chrome, Opera, Safari
xmlHttp = new XMLHttpRequest();
}
else
{ // code for IE6, IE5
xmlHttp = new ActiveXObject('Microsoft.XMLHTTP');
}
return xmlHttp;
}
function webservice(url, options) {
if (typeof (url) == 'object') { //将url写在options里的动静
options = url;
url = url.url;
}
if (!url) return;
if (options.dataType.toLowerCase() == 'json') { //须求JSON格式的数据时,url前边须求丰裕“/方法名”
url = url + '/' + options.method;
}
var xmlHttp = getXmlHttp(); //获取XMLHttpRequest对象
xmlHttp.open('POST', url, true); //异步诉求数据
xmlHttp.onreadystatechange = function () {
if (xmlHttp.readyState == 4) {
try {
if (xmlHttp.status == 200 && typeof (options.success) == 'function') {
options.success(xmlHttp.responseText);
}
else if ((xmlHttp.status / 100 == 4 || xmlHttp.status / 100 == 5) && typeof (options.error) == 'function') {
options.error(xmlHttp.responseText, xmlHttp.status);
}
else if (xmlHttp.status / 100 == 200 && typeof (options.complete) == 'function') {
options.complete(xmlHttp.responseText, xmlHttp.status);
}
else if (typeof (options.failed) == 'function') {
options.failed(xmlHttp.responseText, xmlHttp.status);
}
}
catch (e) {
}
}
}
xmlHttp.setRequestHeader('Content-Type', options.contentType); //设置须求头的ContentType
xmlHttp.setRequestHeader('SOAPAction', options.namespace + options.method); //设置SOAPAction
xmlHttp.send(options.data); //发送参数数据
}

请求JSON数据:

复制代码 代码如下:

window.onload = function () {
var data = '{"somebody": "Krime"}';
var options = {
namespace: '',
method: 'HelloWorld',
contentType: 'application/json; charset=utf-8',
dataType: 'json',
data: data,
success: function (msg) {
alert(msg);
}
};
webservice('', options);
};

请求XML数据:

复制代码 代码如下:

window.onload = function () {
var data = '<?xml version="1.0" encoding="utf-8"?>'

  • '<soap:Envelope xmlns:xsi="" xmlns:xsd="" xmlns:soap=";'
  • '<soap:Body>'
  • '<HelloWorld xmlns=";'
  • '<somebody>Krime</somebody>'
  • '</HelloWorld>'
  • '</soap:Body>'
  • '</soap:Envelope>';
    var options = {
    namespace: '',
    method: 'HelloWorld',
    contentType: 'text/xml; charset=utf-8',
    dataType: 'xml',
    data: data,
    success: function (msg) {
    alert(msg);
    }
    };
    webservice('', options);
    };

测验景况平常。
亟待专心的有个别是,诉求JSON数据时,如若回去类型是DataTable是丰硕的,供给转变来相应数据实体类的List<>再回去。

在消除再次回到XML难点的进度中,还找到另一种减轻方法。具体操作时,是将ContentType设为application/x-www-form-urlencoded,数据体不用JSON也不用XML格式的SOAP包,而是用临近QueryString的“arguement1=XXX&arguement2=XXX”。那些方式是模仿了窗体数据的HTTP POST格式,将种种控件值编码为名称=值对发送出去。

这种情景下的页面地址前边也急需增加/方法名。

你或者感兴趣的稿子:

  • php的webservice的wsdl的XML不可能出示难点的减轻格局
  • 异步调用webservice再次来到responseXML为空的难点消除措施
  • 有关jquery ajax 调用带参数的webservice重回XML数据叁个小细节
  • Jquery Ajax学习实例6 向WebService发出央浼,重回DataSet(XML) 异步调用
  • Web瑟维斯传XML 轻易实例

编辑:关于计算机 本文来源:基于JQuery的访问WebService的代码(可访问Java[Xfir

关键词: