实战:ajax带参数请求slim API

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;
});

转载于:https://www.cnblogs.com/ikodota/p/5645584.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/398130.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于自动布局更新约束方法的总结

1、layoutSubviews 在iOS5.1和之前的版本,此方法的缺省实现不会做任何事情(实现为空),iOS5.1之后(iOS6开始)的版本,此方法的缺省实现是使用你设置在此view上面的constraints(Autolayout)去决定subviews的position和size。 UIView的子类如果需…

java new数组_Java如何使用new创建数组

java语言使用new操作符来创建数组,语法如下:arrayRefVar new dataType[arraySize];上面的语法语句做了两件事:一、使用dataType[arraySize]创建了一个数组。二、把新创建的数组的引用赋值给变量 arrayRefVar。数组变量的声明,和创…

sql 按时间二段排序

业务需用为数据按倒序排序&#xff0c;当天数据排在以往日期前面&#xff0c;但当天数据需按小时进行升序排列 select *from( select vcTitle,dtBeginDate,case when dtBeginDate<getdate() then 1 else 2 end tt from TableA ) a order by Convert(varchar(10),dtBeginDate…

java全局异常处理_详解Spring全局异常处理的三种方式

在J2EE项目的开发中&#xff0c;不管是对底层的数据库操作过程&#xff0c;还是业务层的处理过程&#xff0c;还是控制层的处理过程&#xff0c;都不可避免会遇到各种可预知的、不可预知的异常需要处理。每个过程都单独处理异常&#xff0c;系统的代码耦合度高&#xff0c;工作…

hibernate select语句返回的类型

2019独角兽企业重金招聘Python工程师标准>>> Person类中包含有MyEvent这个类 public class Person{private Long id;private String name;private MyEvent myEvent; } 一、HQL from语句 1、结果类型&#xff1a;List<Person> from Person 或者 from Person…

RDLC系列之五 初试XAML

本章只讲解xaml部分&#xff0c;其余都和winform下一样 1.xaml代码 <Window x:Class"RDLC.WPF.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"xmlns:r…

thinkphp内置标签简单讲解

thinkphp内置标签简单讲解 1、volist循环 name 需要遍历的数据 id 类似于foreach中 value offset 截取数据起始位置 length 截取数据的个数 mod 奇偶数 empty 数据为空的使用 key 编号 2、foreach循环 name 需要遍历的数据 item 类似于foreach中的value key 类似于foreach中的k…

hashcode java_java 的Object类的hashcode()方法具体是怎么实现的?

轻松解说Object.hashcode()的实现&#xff0c;让你看着不累&#xff01;intptr_t ObjectSynchronizer::FastHashCode (Thread * Self, oop obj) {// 如果启用偏向锁if (UseBiasedLocking) {// NOTE: many places throughout the JVM do not expect a safepoint// to be taken h…

Android 数据库升级解决方案

转自&#xff1a;http://blog.csdn.net/leehong2005/article/details/9128501 请考虑如下情况&#xff1a; 在数据库升级时&#xff0c;不同版本的数据库&#xff0c;他们定义的表结构完全可能是不一样的&#xff0c;比如V1.0的表A有10个column&#xff0c;而在V1.1的表A有12个…

区间素数筛法

给定整数a和b&#xff0c;请问区间[a,b)内有多少个素数&#xff1f; a<b<10^12 b-a<10^6 因为b以内合数的最小质因数一定不超过sqrt(b),如果有sqrt(b)以内的素数表的话&#xff0c;就可以把筛选法用在[a,b)上了,先分别做好[2,sqrt(b))的表和[a,b)的表&#xff0c;然后…

[php入门] 3、WAMP中的集成MySQL相关基础操作

前言&#xff1a;本文以小白视角了解WAMP集成开发环境中的MYSQL&#xff0c;涉及的面广而浅&#xff0c;算是导读性质。 1、启动运行熟悉WAMP中的MySQL 先有库、再有表、数据最终以记录的形式插入表中。其中对数据进行操作使用SQL语句&#xff0c;SQL是结构化的查询语言。 在wa…

apns java 证书_APNS推送服务证书制作 图文详解教程(新)

iOS消息推送的工作机制可以简单的用下图来概括&#xff1a;Provider是指某个iPhone软件的Push服务器&#xff0c;APNS是Apple Push Notification Service的缩写&#xff0c;是苹果的服务器。上图可以分为三个阶段&#xff1a;第一阶段&#xff1a;应用程序把要发送的消息、目的…

java 凑整_Java语言中的取整运算(包括截尾取整,四舍五入,凑整)? – 日记

import java.math.BigDecimal;import java.text.DecimalFormat;public class TestGetInt{public static void main(String[] args){double i2, j2.1, k2.5, m2.9;System.out.println(”舍掉小数取整:Math.floor(2)” (int)Math.floor(i));System.out.println(”舍掉小数取整:M…

企业员工工资管理系统

企业工资管理是人力资源管理的一个核心环节,在市场经济和全球一体化的大背景下&#xff0c;随着人力资源管理在战略层面上发挥着越来越重要的作用&#xff0c;传统的薪酬制度已于现代化的要求不匹配&#xff0c;并越来越限制着企业的发展。本系统以员工的考勤信息作为基础&…

Android近场通信---NFC基础(二)(转)

转自 http://blog.csdn.net/think_soft/article/details/8171256 应用程序如何调度NFC标签 当标签调度系统完成对NFC标签和它的标识信息封装的Intent对象的创建时&#xff0c;它会把该Intent对象发送给感兴趣的应用程序。如果有多个应用程序能够处理该Intent对象&#xff0c;就…

:base(参数)

:base(必须有值)&#xff1a;作用是将父类的值继承过来&#xff0c;如果不在构造函数中加入&#xff1a;base(变量) 的话&#xff0c;原父类中的 Model则无法继承过来。 例如&#xff1a;在父类MSG_Model,有连个属性&#xff0c;如图 1.子类构造函数不写:base(参数) 2.1.子类构…

如何在{{input}}中使用action

文章来源&#xff1a;Ember Teach 开发中经常遇到需要在一个input输入框触发JS函数&#xff0c;那么对于Ember.js的{{input}}又如何才能出发自定义的action呢&#xff1f; 实现起来非常简单&#xff01;请看下面的代码演示&#xff1a; 旧版本实现方式 {{input type"text&…

java json utf-8_Java 编码 和JSON

1.编码序列化(urlencode编码)&#xff1a;经过urlencode编码String a"[{\"clubNo\":\"10000002\",\"clubType\":\"1\"},{\"clubNo\":\"10000003\",\"clubType\":\"4\"},{\"clubNo\…

MVC5 + EF6 完整入门教程三

MVC5 EF6 完整入门教程三 原文:MVC5 EF6 完整入门教程三期待已久的EF终于来了。 学完本篇文章&#xff0c;你将会掌握基于EF数据模型的完整开发流程。 本次将会完成EF数据模型的搭建和使用。 基于这个模型&#xff0c;将之前的示例添加数据库查询验证功能。 文章提纲 概…

纯手写的css3正方体旋转效果

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>css3旋转立方体效果</title><style type"text/css">*{margin: 0;padding: 0;}.box{width: 400px;height: 400px;border: 1px solid #000;margin: 30p…