验证由iOS发送的PHP中的自定义HTTP标头


Validate custom HTTP header in PHP which sent by iOS

我要做的是,将带有自定义标头的HTTP请求从我的iOS应用程序发送到我的本地主机,该主机在我的MAC机器中运行XAMPP。然后有一个PHP页面,它检查我的特定标题并根据该标题进行响应。

以下是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 脚本中检查特定标头的方式

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

我总是得到"非权威信息"作为回应。但是我需要用我的名字获得响应,该响应的状态代码为 200。

据我所知,问题在于我在PHP脚本中检查HTTP标头的方式

if (strcmp($value, "X-USERNAME: apiuser") == 0)

可能这不是检查标头值并将其与 PHP 中预定义的字符串值进行比较的标准方法。有没有办法打印它从PHP端收到的HTTP请求头?

headers_list()返回已发送或准备发送的响应标头数组。

要检查请求标头,请使用 getallheaders() 。它返回标头名称和值对的关联数组,因此要检查标头是否存在X-USERNAME并且其值是否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()