简述WebService的使用(二)

上集回顾

  上一篇我简单的介绍了一下整个WebService建立和后端访问的过程,如果感兴趣可以看一看:简述WebService的使用(一)

  //如有不懂请留言,觉得有用请点赞

内容提要

  这一篇主要介绍一下WebService的ajax前端访问,侧重点是“跨域访问”。有兴趣的继续看过来···

  至于跨域访问的概念,我就说一句,就是“网站A想访问域名不同的网站B”(具体概念可以上网查),这在网络安全上是不被赞成的,大部分大型网站也关闭这个访问,然而需求依然在。

  网上有很多解决方案,比如Ifame,代理,jsonp等等。

  建议:如果没有必要就不要用。

  重点:本文主要介绍一下jsonp的用法,希望可以帮助到各位小主。

具体内容

  一、配置文件中添加适当的配置:

 1     <system.web>
 2       <compilation debug="true" targetFramework="4.5" />
 3       <httpRuntime targetFramework="4.5" />
 4       <customErrors mode="Off"></customErrors>
 5       <webServices>
 6         <protocols>
 7           <add name="HttpGet"/>
 8           <add name="HttpPost"/>
 9         </protocols>
10       </webServices>
11     </system.web>

  1、若要使他人能够在远程计算机上查看此特定错误信息的详细信息,请在位于当前 Web 应用程序根目录下的“web.config”配置文件中创建一个 <customErrors> 标记。然后应将此 <customErrors> 标记的“mode”属性设置为“Off”。 <!-- Web.Config 配置文件 --> <configuration> <system.web> <customErrors mode="Off"/> </system.web> </configuration>

  注释: 通过修改应用程序的 <customErrors> 配置标记的“defaultRedirect”属性,使之指向自定义错误页的 URL,可以用自定义错误页替换所看到的当前错误页。

  2、所有四个可能的协议都使用 HTTP/1.1(超文本传输协议)作为其传输协议。从字面上可以看出,HttpGetHttpPost 协议值分别使用 HTTP 的 GETPOST 方法。HttpSoap 值也使用 POST 方法,但不使用 HTML 表单使用的传统 HTTP POST 语义。如对此想要深入理解,请看MSDN介绍:

  http://msdn.microsoft.com/zh-cn/library/4yx7be39%28v=vs.100%29.aspx

  二、后端代码(WebService)

  要想把后端代码写的完整,还不是一下子就能理解的,这需要和前端代码配合着看,所以这里需要我们知道的是,这种方式(jsonp)只适用于同时掌握WebService的写权利的亲们~~~

  上一篇里面有全部代码,这里主要是贴出主要代码:

 1         [WebMethod]
 2         public void HelloWorld1()
 3         {
 4             HttpRequest request = HttpContext.Current.Request;
 5             HttpResponse response = HttpContext.Current.Response;
 6             string jsoncallback = request.QueryString["jsoncallback"];
 7             //response.ContentEncoding = System.Text.Encoding.UTF8;
 8             //response.ContentType = "application/json";
 9             Context.Response.Write(jsoncallback + "({ \"state\": { \"return\": \"true\", \"info\": \"成功\", \"code\": \"HelloWorld\" } })");
10             response.End();
11         }

  里面的具体内容,大家应该可以大部分理解,至于jsoncallback是什么东西,等我慢慢道来~~~

  可以看到,这里面是将要输出的内容拼成了jsoncallback(JSON内容)的格式,原因就是jsonp这个非官方格式所要求的解析格式,这样在前端才能以一种回调函数的方式获取到内容。

  可能各位看的一头雾水,下面来看前端代码。

  三、前端代码(JQuery)

 1     <script>
 2         $(document).ready(function () {
 3             $.ajax({
 4                 type: "GET",   //访问WebService使用请求
 5                 contentType: "application/json", //WebService 会返回Json类型
 6                 url: "http://WebService的地址/WebService1.asmx/HelloWorld1?jsoncallback=?", //调用WebService的地址和方法名称组合 ---- WsURL/方法名
 7                 //data: { str: ‘hello‘ },         //这里是要传递的参数,格式为 data: "{paraName:paraValue}"
 8                 dataType: ‘jsonp‘,
 9                 success: function (result) {     //回调函数,result,返回值
10                     result = result.state;
11                     alert("return:" + result.return + "   info:" + result.info + "   code:" + result.code);
12                 },
13                 error: function (jqXHR, textStatus, errorThrown) {
14                     alert("jqXHR:" + jqXHR);
15                 }
16             });
17         })
18     </script>

  看,这里~~~

  

  这里~~~

  

  这就是主要变化,这种方法利用jsonp格式将生成的一个名字类似于jQuery1102006871441782948595_1420771230089的jsoncallback作为参数传到后台,后台拼成相应格式的函数形式返回,前台拿到这个函数后即可以函数调用的方式获取其中的json数据,包装了一下而已,这种暗度陈仓的方式~~~也是醉了。

  可能有些人就会问,那为什么这样就能访问了呢?这就是问题所在。

  jsonp的最基本的原理是:动态添加一个<script>标签,而script标签的src属性是没有跨域的限制的。这样说来,这种跨域方式其实与ajax XmlHttpRequest协议无关了.
  这样其实"jQuery AJAX跨域问题"就成了个伪命题了,jquery $.ajax方法名有误导人之嫌.
  如果设为dataType: ‘jsonp‘, 这个$.ajax方法就和ajax XmlHttpRequest没什么关系了,取而代之的则是JSONP协议.
  JSONP是一个非官方的协议,它允许在服务器端集成Script tags返回至客户端,通过javascript callback的形式实现跨域访问
  JSONP即JSON with Padding。由于同源策略的限制,XmlHttpRequest只允许请求当前源(域名、协议、端口)的资源。如果要进行跨域请求,
  我们可以通过使用html的script标记来进行跨域请求,并在响应中返回要执行的script代码,其中可以直接使用JSON传递javascript对象。
  这种跨域的通讯方式称为JSONP。(转载)

  这段话应该将这个原理讲述的很清楚了吧,各位看官,通过以上的方式就能简单的实现跨域访问的问题了,不过。。。jsoncallback这个取名可能很重要,如果不写的话,会有一个默认的名字就是callback传过去。

  参数:

  

  响应:

  

  输出:

  

  这时前台界面上多了一个东西,想必大家应该也知道了吧。

  

  它以脚本的形式出现在这里了~~~

遇到的问题

  由于笔者也是刚接触这一块,所以还是历经了一些困难。

  因为最开始不明白这中的道理,所以走了不少弯路,包括配置文件的内容,和前后端的不断调试,为避免各位走弯路,浪费时间,特写了这篇文章(此处该有掌声~~~)

  问题:

  1、前端访问不到的数据

  可能是因为XML配置的问题,就是上文中提到的两处配置,其实出现错误的时候都有相应的提示。

  2、前端能访问到数据,但是有JS错误,类似于jQuery1102020437700958943394_1420766736229 was not called,错误名称是parsererror

  可能的原因就是jsonp的格式没有拼对,或者后台没有拿到那个jsoncallback字符串,这样前端无法按照jsonp的格式去回调函数,这样就会出现这个错误

至此结束,欢迎交流

OK,顿时神清气爽啊~~

时间: 2024-10-11 11:24:56

简述WebService的使用(二)的相关文章

简述WebS简述WebService与.NET Remoting的区别及适应场合

为了能清楚地描述Web Service 和Remoting之间的区别,我打算从他们的体系结构上来说起: Web Service大体上分为5个层次: 1. Http传输信道 2. Xml的数据格式 3. SOAP封装格式 4. WSDL的描述方式 5. UDDI 总体上来讲,.Net 下的 Web Service结构比较简单,也比较容易理解和应用: 一般来讲在.Net结构下的WebService应用都是基于.Net framework以及IIS的架构之下,所以部署(Dispose)起来相对比较容易

java程序调用xfire发布的webService服务(二)

在上一篇的调用xfire发布的webService服务中,我只是从服务端返回了一个字符串给客户端,却没有测试从客户端传递数据给服务端.而实际应用中一般是不太可能只出现这样的应用场景的,因此我便更进一步测试了客户端传递数据给服务端. 因为相关的jar包在上一篇已经说过,因此便不再重复说明,这次的测试步骤如下: 一.测试向服务端传递字符串(重点在第二个): 为了进一步理解服务搭建,我重新写了一个服务端服务类: 接口: package xfireTest; public interface XFire

WebService学习总结(二)——WebService相关概念介绍

一.WebService是什么? 1. 基于Web的服务:服务器端整出一些资源让客户端应用访问(获取数据) 2. 一个跨语言.跨平台的规范(抽象) 3. 多个跨平台.跨语言的应用间通信整合的方案(实际) 二.为什么要用Web service? web service能解决: 跨平台调用 跨语言调用 远程调用 三.什么时候使用web Service? 1. 同一家公司的新旧应用之间 2. 不同公司的应用之间 3. 一些提供数据的内容聚合应用:天气预报.股票行情 四.Web Service中的几个重

WebService技术(二)

前言:学习笔记,以供参考 Apache CXF 是一个开源的 Services 框架,CXF 帮助您利用 Frontend 编程 API 来构建和开发 Services .可以与Spring进行快速无缝的整合.灵活的部署,可以运行在Tomcat,Jboss,Jetty(内置),IBMWS,BeaWL上面. 更多CXF介绍:http://www.ibm.com/developerworks/cn/education/java/j-cxf/ 1 cxf发布服务的类 用两个不同的类发布应用: a. S

webService总结(二)——使用CXF手动发布webService(不使用Spring)

上篇博客:webService总结(一)--使用CXF发布webService(不使用Spring) 介绍了不使用Spring自动发布webService,这篇博客介绍第二种方法--使用CXF手动发布webService(不使用Spring). CXF自动发布webService,我们使用的是Tomcat服务器.而使用CXF手动发布webService我们不再使用Tomcat,取而代之的是内嵌的jetty服务器.其实,jetty跟Tomcat并没有本质的区别,只是表现的形式不同,使用方法不同.既

简述WebService的使用

环境: vs版本:vs2013 windows版本:win7 IIS版本:IIS7.0 配置环境: 主要针对于IIS ·首先,有很多人的机器上都没有打开IIS服务 控制面板->程序和功能->打开或关闭windows功能(左侧,较慢,稍等)->Internet信息服务(默认打开的功能不能完全满足之后的需要,可以全部打开或者网上查询一下需要打开哪些) ·接着,在管理工具中打开Internet 信息服务(IIS)管理器 ·最后,在网页上输入http://127.0.0.1后能看到IIS的主页,

简述WebService与.NET Remoting的区别及适应场合 WCF

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://zhoufoxcn.blog.51cto.com/792419/166990 为了能清楚地描述Web Service 和Remoting之间的区别,我打算从他们的体系结构上来说起: Web Service大体上分为5个层次: 1. Http传输信道 2. XML的数据格式 3. SOAP封装格式 4. WSDL的描述方式 5. UDDI 总体上来讲,.NET 下的 Web Ser

WebService系列(二)--WSDl File简单举例

1:新建java项目 2:新建一个包,用来存放待会生成的类 3:新建文件 wsdl 4:wsdl文件命名,用的是哪个service,就用谁来命名,这里用手机的MobileCodeWS 5:点击finish,文件生成 http://www.webxml.com.cn/WebServices/WeatherWebService.wsdl 6:生成的文件除了头文件 <?xml version="1.0" encoding="UTF-8" standalone=&qu

.net(二)

1.维护数据库的完整性.一致性.你喜欢用触发器还是自写业务逻辑?为什么? 答:尽可能用约束(包括CHECK.主键.唯一键.外键.非空字段)实现,这种方式的效率最好:其次用触发器,这种方式可以保证无论何种业务系统访问数据库都能维持数据库的完整性.一致性:最后再考虑用自写业务逻辑实现,但这种方式效率最低.编程最复杂,当为下下之策. 2.什么是事务?什么是锁? 答:事务是指一个工作单元,它包含了一组数据操作命令,并且所有的命令作为一个整体一起向系统提交或撤消请求操作,即这组命令要么都执行,要么都不执行