restful api 支持get,post,put,delete等方法,那么jquery客户端怎么去实现呢?涉及到跨域又怎么办?

很多时候需要传递一个token(api_key) 去识别用户身份,获取访问接口的权限。这里的token 不放在 header中(那个也能实现,就是比较麻烦,空了后面写),是query类型。

首先设置下跨域的header:

header('content-type: application/json; charset=utf-8');

header("Access-Control-Allow-Origin:*");

header("Access-Control-Allow-Methods:GET,POST,PUT,DELETE,OPTIONS");

header("Access-Control-Allow-Headers:Content-Type");

为什么要加 Content-Type 呢?因为ajax的put方法会主动附加一个 Content-Type,OPTIONS方法的 header不一致导致put方法访问失败。

看到本文的朋友,估计会有我之前的疑问,太复杂的原理就不讲了,简单说下:ajax的put和delete方法时候,会主动先用OPTIONS方法尝试获取服务器的header信息,如果一致才会真实的发起PUT或DELETE方法。故服务器端应该在对应的api创建一个OPTIONS api(内容可以为空)。

基于这个原理,也可以实现在header中存放token,只是命名不能叫“token,api_key等”,应该叫"x-api-key,x-my-key" 的类似形式(x开头,否则获取不到。原因我也不不讲了),那么客户端发起ajax请求时候,需要在headers里增加前面说的"x-xxx-xx"的内容,服务器也做修改,如:header("Access-Control-Allow-Headers:access-control-allow-origin,content-type,x-api-key");大多数情况下,服务器端 设置的Access-Control-Allow-Headers 是固定的,那么就需要客户端“造出”与服务器端一样的header. 即便是不需要x-api-key的地方也在要header中传递这个参数,否则header就不一致导致失败。

服务端环境:nginx,slim3.0

客户端环境:framework7(dom7) [jquery一样的有效。]

附客户端代码:

            success: function (data) {
alert(data);
}
});
}); $$('#testput').on('click',function(){
$$.ajax({
url: 'http://apihaomai.runger.net/v1/mygroup/booking/quickPass',
method: 'PUT',
dataType: 'json',
data: {
api_key: '1121212122323213'
},
success: function (data) {
alert(data);
}
});
}); $$('#testdelete').on('click',function(){
$$.ajax({
url: 'http://apihaomai.runger.net/v1/me/stall/1',
method: 'DELETE',
dataType: 'json',
data: {
api_key: '1121212122323213'
},
success: function (data) {
alert(data);
}
});
});

服务器端代码:

$app->GET('/users/logout', function($request, $response, $args) {

        $queryParams = $request->getQueryParams();
$token = $queryParams['api_key'];
$response= output_data($response,['token '=>$token ]);
return $response;

});

$app->POST('/packet/{packet-id:[0-9]+}/buy', function($request, $response, $args) {

        $queryParams = $request->getParams();
$token = $queryParams['api_key'];
$phone = $queryParams['phone'];
$addressId = $queryParams['address_id']; $response->write(json_encode(['api_key'=>$token,'phone'=>$phone,'address_id'=>$addressId]));
return $response;
});

$app->PUT('/mygroup/booking/quickPass', function($request, $response, $args) {

        $queryParams = $request->getParams();
//注意:这里使用的getParams()方法,非 getQueryParams()。
$token = $queryParams['api_key']; $response->write(json_encode(['api_key'=>$token]));
//$response->write('How about implementing mygroupBookingQuickPassPut as a PUT method ?');
return $response;

});

//ajax post方法兼容(会先options一下)

$app->OPTIONS('/mygroup/booking/quickPass', function($request, $response, $args) {

return $response;

});

$app->DELETE('/me/stall/{stall-id:[0-9]+}', function($request, $response, $args) {

        $queryParams = $request->getQueryParams();
$token = $queryParams['api_key'];
$stall_id=$args['stall-id'];
$response->write(json_encode(['apk_key'=>$token,'stall_id'=>$stall_id]));
return $response;
});

$app->OPTIONS('/me/stall/{stall-id:[0-9]+}', function($request, $response, $args) {

return $response;

});

实战:ajax带参数请求slim API的更多相关文章

  1. python中requests库get方法带参数请求

    起因是想爬五等分的花嫁的漫画.这是其中的一个坑 先上代码 data={ 'cid':567464, , 'key':'', 'language':1, 'gtk':6, '_cid':567464, ...

  2. springMVC带参数请求重定向

    SpirngMVC返回逻辑视图名 可以分下面几种情况: 1. servlet进行请求转发,返回到jsp页面,如  return "index.jsp" ; 2. servlet 返 ...

  3. $.ajax 跨域请求 Web Api

    WepApi确实方便好用,没有配置文件,一个apicontroller直接可以干活了.但今天用$.ajax跨域请求的时候总是获取不到数据,用fiddler一看确实抓到了数据,但回到$.ajax函数中, ...

  4. 微信小程序之跳转、请求、带参数请求小例子

    wx.request(OBJECT) wx.request发起的是 HTTPS 请求.一个微信小程序,同时只能有5个网络请求连接. 具体参数说明参看微信小程序官方文档-发起请求. 例: //当页面加载 ...

  5. RestTemplate常用的get和post带参数请求

    在RestTemplate提供的方法中,有一个参数就是目标URL,参数是跟在后面的一个数量可变参数,但是在这里就有个问题,这个方法怎么知道我传的参数值是对应在目标接口的哪个参数的呢: public & ...

  6. 关于RedirectAttributes 重定向带参数请求问题

    @RequestMapping("/delete") public String delete(String id, RedirectAttributes redirectAttr ...

  7. js中ajax连接服务器open函数的另外两个默认参数get请求和默认异步(open的post方式send函数带参数)(post请求和get请求区别:get:快、简单 post:安全,量大,不缓存)(服务器同步和异步区别:同步:等待服务器响应当中浏览器不能做别的事情)(ajax和jquery一起用的)

    js中ajax连接服务器open函数的另外两个默认参数get请求和默认异步(open的post方式send函数带参数)(post请求和get请求区别:get:快.简单 post:安全,量大,不缓存)( ...

  8. 【笔记】Asp.Net WebApi对js POST带参数跨域请求的支持方案

    先说下需求:在原来的WebApi项目中增加对js跨域的请求支持,请求方式:以POST为主,webapi路由规则根据原项目需求修改如下: public static void Register(Http ...

  9. ajax GET和POST请求web api 的几种方式

    GET请求 1.无参数get请求 一般get请求有两种写法,一种是 $.get()   一种是$.ajax({type:"get"}), 我个人比较喜欢用后者. 下面例子主要是ge ...

随机推荐

  1. IIS7.5 HTTP错误403.1-Forbidden 您尝试从某个目录运行CGI、ISAPI或其他可执行程序,但该目录不允许运行可执行文件

    ----------------错误详细---------------------------------------------------------------- --------------- ...

  2. 插件~使用ECharts动态在地图上标识点

    ECharts可以很方便的在网页上绘制地图,图表,并且可以提供下载图像,放大,缩小,拖动等功能,今天主要说一下它的地图类型(type:'map')是如何实现的. 首先在ECharts地图的坐标需要我们 ...

  3. Atitit. BigConfirmTips 控件 大数据量提示确认控件的原理and总结O9

    Atitit. BigConfirmTips 控件 大数据量提示确认控件的原理and总结O9 1. 主要的涉及的技术 1 2. 主要的流程 1 3. 调用法new confirmO9t(); 1 4. ...

  4. atitit.组件化事件化的编程模型--服务端控件(1)---------服务端控件与标签的关系

    atitit.组件化事件化的编程模型--服务端控件(1)---------服务端控件与标签的关系 1. 服务器控件是可被服务器理解的标签.有三种类型的服务器控件: 1 1.1. HTML 服务器控件  ...

  5. atitit.提升稳定性---hibernate 增加重试retry 机制解决数据库连接关闭

    atitit.提升稳定性---hibernate 增加重试retry 机制解决数据库连接关闭 1. 流程总结 retry(5times).invoke(xxx).test().rest().$() t ...

  6. iOS开发---集成百度地图完善版

    一.成为百度的开发者.创建应用 http://developer.baidu.com/map/index.php?title=首页 (鼠标移向 然后选择你的项目需要的功能 你可以在里面了解到你想要使用 ...

  7. 搭建Java环境JDK,和运行环境JRE

    1:想要学习Java第一步就是搭建Java环境,就是安装JDK,又因为JDK里面包含JRE,所以在安装JDK的过程中就安装了JRE,所以以下只是给出了JDK的安装包,自行下载安装即可 链接:http: ...

  8. 针对远程Git代码库使用SSH公匙

    → 运行Git Bash→ 创建SSH公匙和私匙ssh-keygen -t rsa→ 输入SSH公匙存放文件,选择使用默认的,按Enter→ 如果已经存在,提示是否重写,输入n,按Enter→ 打开C ...

  9. Pomelo:网易开源基于 Node.js 的游戏服务端框架

    Pomelo:网易开源基于 Node.js 的游戏服务端框架 https://github.com/NetEase/pomelo/wiki/Home-in-Chinese

  10. MongoDB副本集配置系列九:MongoDB 常见问题

    What is a namespace in MongoDB? If you remove a document, does MongoDB remove it from disk? When doe ...