验证由 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()