验证由 iOS 发送的 PHP 中的自定义 HTTP header
Validate custom HTTP header in PHP which sent by iOS
我想做的是,从我的 iOS 应用程序向我的本地主机发送带有自定义 header 的 HTTP 请求,该主机在我的 MAC 中运行 XAMPP机器。然后有一个 PHP 页面检查我的特定 header 并据此作出回应。
以下是iOS部分
NSString *urlStr = @"http://127.0.0.1/restapi/index.php?name=anuja";
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
[request setURL:[NSURL URLWithString:urlStr]];
[request setHTTPMethod:@"GET"];
[request addValue:@"apiuser" forHTTPHeaderField:@"X-USERNAME"];
NSLog(@"%s - %d # allHTTPHeaderFields = %@", __PRETTY_FUNCTION__, __LINE__, [request allHTTPHeaderFields]);
NSURLResponse *response;
NSError *error;
NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
NSString *responseStr = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
NSLog(@"%s - %d # responseStr = %@", __PRETTY_FUNCTION__, __LINE__, responseStr);
下面是我从 PHP 脚本
检查特定 header 的方式
if (isset($_GET["name"])) {
foreach (headers_list() as $name => $value) {
if (strcmp($value, "X-USERNAME: apiuser") == 0) {
$name = $_GET["name"];
$result = json_encode(array('name' => $name), JSON_FORCE_OBJECT);
sendResponse(200, json_encode($result));
return true;
}
}
sendResponse(203, 'Non-Authoritative Information');
return false;
}
我总是收到 "Non-Authoritative Information" 作为回应。但是我需要得到带有我的名字的响应,它在 200 状态代码中。
据我所知,问题出在我检查 PHP 脚本 PHP 中的 HTTP header 的方式上
if (strcmp($value, "X-USERNAME: apiuser") == 0)
可能这不是检查 header 值并将其与 PHP 中的预定义字符串值进行比较的标准方法。有什么方法可以打印从 PHP 端收到的 HTTP 请求 header 吗?
headers_list()
returns 已发送或准备发送的 响应数组 header。
要检查 请求 header,请使用 getallheaders()
。它 returns 一个 header 名称和值对的关联数组,因此要检查 X-USERNAME
header 是否存在并且它的值为 apiuser
,您可以这样做类似于:
$request_headers = getallheaders();
if(isset($request_headers['X-USERNAME']) && $request_headers['X-USERNAME'] == 'apiuser') {
// do stuff
}
您还可以使用此函数 getallheaders() ,apache_request_headers() ,http_get_request_headers()
我想做的是,从我的 iOS 应用程序向我的本地主机发送带有自定义 header 的 HTTP 请求,该主机在我的 MAC 中运行 XAMPP机器。然后有一个 PHP 页面检查我的特定 header 并据此作出回应。
以下是iOS部分
NSString *urlStr = @"http://127.0.0.1/restapi/index.php?name=anuja";
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
[request setURL:[NSURL URLWithString:urlStr]];
[request setHTTPMethod:@"GET"];
[request addValue:@"apiuser" forHTTPHeaderField:@"X-USERNAME"];
NSLog(@"%s - %d # allHTTPHeaderFields = %@", __PRETTY_FUNCTION__, __LINE__, [request allHTTPHeaderFields]);
NSURLResponse *response;
NSError *error;
NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
NSString *responseStr = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
NSLog(@"%s - %d # responseStr = %@", __PRETTY_FUNCTION__, __LINE__, responseStr);
下面是我从 PHP 脚本
检查特定 header 的方式 if (isset($_GET["name"])) {
foreach (headers_list() as $name => $value) {
if (strcmp($value, "X-USERNAME: apiuser") == 0) {
$name = $_GET["name"];
$result = json_encode(array('name' => $name), JSON_FORCE_OBJECT);
sendResponse(200, json_encode($result));
return true;
}
}
sendResponse(203, 'Non-Authoritative Information');
return false;
}
我总是收到 "Non-Authoritative Information" 作为回应。但是我需要得到带有我的名字的响应,它在 200 状态代码中。
据我所知,问题出在我检查 PHP 脚本 PHP 中的 HTTP header 的方式上
if (strcmp($value, "X-USERNAME: apiuser") == 0)
可能这不是检查 header 值并将其与 PHP 中的预定义字符串值进行比较的标准方法。有什么方法可以打印从 PHP 端收到的 HTTP 请求 header 吗?
headers_list()
returns 已发送或准备发送的 响应数组 header。
要检查 请求 header,请使用 getallheaders()
。它 returns 一个 header 名称和值对的关联数组,因此要检查 X-USERNAME
header 是否存在并且它的值为 apiuser
,您可以这样做类似于:
$request_headers = getallheaders();
if(isset($request_headers['X-USERNAME']) && $request_headers['X-USERNAME'] == 'apiuser') {
// do stuff
}
您还可以使用此函数 getallheaders() ,apache_request_headers() ,http_get_request_headers()