####前端直接使用jquery访问restify建立的rest服务 涉及到跨域了,应该使用jsonp访问. 那这样rest服务就必须修改成符合jsonp格式的格式 callback({xx:xx}) 吗??
你这耦合的也太深了。
作为服务器,还管你跨不跨域。 只要你够了权限, 发给你http消息文本就是服务器唯一要做的事情。
如果你要json数据,让服务器把json格式化成字符串放进http消息流,客户端取出来解析就行了。
至于浏览器的jsonp, 不过是浏览器内部程序把接收到的http消息文本进行了一次JSON.parse而已。
没接触过rest的服务,之前一直用.net的webservice 如果不跨域,直接返回json就可以了; 但是要跨域 使用jsonp 就不能直接返回json, 是要写成 “callback(json字符串)” 格式.
刚试验了一下, restify是直接
res.send(json);
方便,跨不跨域都可以用.
话说 一般webservice很少直接前端用js调用,都是先引入到项目; 想问一下 , rest服务 典型的使用方式是直接用前端的js调用吗?
@jeffZhong ?name=value&callback(data) 这个只是浏览器提供的程序格式而已, 内部实际上跟ajax差不多, ie9以上的ajax也是支持跨域的。 至于rest服务, 只是http请求资源的一套区别旧规则的方式而已。 http://host:port/123456.html?user=lili 这是以前常用的方式, rest提倡http://host:port/lili/1223456.html这样的方式, url定位资源, 而不是用querystring (?后边那一段)。
@jeffZhong rest服务只是一个服务器应用程序,编写的规范而已。 nodejs中就是路由的url判断方式: 比如你可以用/index.html?user=lili来设置路由, rest提倡用/lili/index.html这样的方式设置路由. http原理上只有请求和响应, 跨域其实是浏览器的自保护机制。用nodejs的request也可以创建跨域请求。request()可不管客户端是来自哪里,ta只做一件事:向服务器发送请求。 而使用浏览器的ajax或者jsonp的时候,浏览器内部代码会运行些保护代码。
@jeffZhong 前端的js调用其实是浏览器的标准规范里使用的。 你用的.net,应该是微软自己的asp.net控件给你封装了这部分功能, 所以你会感觉到用起来不一样。
@jeffZhong <script src=“http://host:port/path?..callback”></script> 这个是jsonp的“未封装”方式。使用script标签加载http://host:port/path的内容,然后把获取的http服务器响应内容,使用callback回调函数运行。
用ajax必然会涉及到跨域,如果是首屏展示可以用bigpipe,如果是异步请求也可以用websocket替代。对ajax异步请求是需要做安全限制的,特别是跨域的。
jsonp不是这样的,哥们,jsonp是利用脚本载入进行跨域的,http传输不涉及到域的问题。
Restify内置有支持jsonp的中间件,必须的
@tulayang 你这个说的不是跨域返回格式的问题了,这个谁都知道了
@tulayang 我用的是jq 的ajex 的jsonp ,已经封装好了的, jsonp的原理我已经很清楚了,你有没有试过前端直接跨域调用先??
所以直接写,很方便
@jeffZhong 浏览器跨域, jsonp是比较好用的。 另外ajax也是可以跨域的, 只要url是http绝对路径。 但是ie9以下版本的ie浏览器不支持ajax跨域, firefox chrome opera的最新版本都支持ajax跨域。