前端如何访问rest服务
发布于 10 年前 作者 jeffzhong 10082 次浏览 最后一次编辑是 8 年前

####前端直接使用jquery访问restify建立的rest服务 涉及到跨域了,应该使用jsonp访问. 那这样rest服务就必须修改成符合jsonp格式的格式 callback({xx:xx}) 吗??

16 回复

你这耦合的也太深了。

作为服务器,还管你跨不跨域。 只要你够了权限, 发给你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跨域。

回到顶部