客户端向后端接口传递自定义Http请求头HttpHeader
所属分类:Csbase | 发布于 2023-01-25 22:51:20
app客户端调用api接口时,一般会把token及一些其它信息放到http请求头里面一起发送给服务端,这里小小总结一下。
主要遇到的问题一般是客户端发送的请求头字段名称和服务端接收的字段名称的规范的问题。
假设服务端定义接口时这样:HTTP_APP_VERSION或者APP_VERSION。
这个时候只要记住这几个原则就行:
1、客户端请求头不区分大小写,服务器请求头所有单词都会被转换成大写字母。
2、接口定义的字段带有下划线时,客户端用连字符-连接代替,不能使用下划线,带下划线的http请求头字段会被网络过滤掉。
3、HTTP_是服务器自动生成的,客户端传递的时候不用传。但是服务端接收的时候,不管客户端要写全程,也就是带HTTP_开头的字段名称。
这里客户端语言以Swift,服务端语言以php为例
客户端传递的的字段:
var commonHeaders: HTTPHeaders {
["app-version": "1.2.3",
"app-device-type": "ios_iphone",
"token": "xxxx"]
}
服务端接收:
// 字段名称必须大写,单词使用_连接
$appVersion = $_SERVER['HTTP_APP_VERSION'];
print_r($appVersion);
结论,直接用$_SERVER变量接收时要求最为严格,全部大写加下划线连接。而且使用的时候要加上判断,上面的代码,当HTTP_APP_SERVER字段不存在时,会发生运行时错误。
服务端thinkphp的input函数接收:
$appVersion1 = input('server.HTTP_APP_VERSION'); // 获取成功
$appVersion2 = input('server.HTTP_APP_version'); // 获取成功
$appVersion3 = input('server.http_app_version'); // 获取成功
$appVersion4 = input('server.HTTP-APP-VERSION'); // 获取失败
$appVersion5 = input('server.APP_VERSION'); // 获取失败
var_dump($appVersion1, $appVersion2, $appVersion3, $appVersion4, $appVersion5);
结论,使用thinkphp的input函数接收时,不区分大小写,不能省略开头的HTTP_,只能和$_SERVER一样,使用下划线。其实也很好理解,input()函数的server只是简单封装了$_SERVER。
服务端用thinkphp的Request类的header方法接收:
$appVersion1 = $this->request->header('HTTP_APP_VERSION'); // 获取失败
$appVersion2 = $this->request->header('APP_VERSION'); // 获取成功
$appVersion3 = $this->request->header('APP_version'); // 获取成功
$appVersion4 = $this->request->header('app-version'); // 获取成功
$appVersion5 = $this->request->header('APP-VERSION'); //获取成功
var_dump($appVersion1, $appVersion2, $appVersion3, $appVersion4, $appVersion5);
结论,使用thinkphp的Request类的header方法接收时,需要去掉开头的HTTP_字符,至于大小写,用连字符还是用下划线都没有关系,header()方法已经做了自动转换。