【问题标题】:How to make HTTP REQUEST to mantisBT's REST API using angular Http?如何使用 Angular Http 向 mantisBT 的 REST API 发出 HTTP 请求?
【发布时间】:2017-06-22 13:44:08
【问题描述】:

背景:

我在测试服务器上安装了 mantisBT 2.5.0,启用了 REST API(目前处于测试阶段)。之后,我生成了一个 API 密钥,并尝试使用 /api/rest/swagger 上的 swagger 页面发出测试 HTTP 请求。这工作正常。 (我只能在将 .htaccess 重命名为 _htaccess 后才能访问此页面)

我想做的事:

我想在我的应用程序中实现一项功能,以便在不直接访问 mantisBT 的情况下发送“简单”的错误报告。为了测试 API,我实现了这个函数,它只调用一个“get issue”请求。如果可行,我可以实现一种方法来创建问题。

问题

我无法将带有 API 令牌的属性“授权”添加到请求的 HTTP 标头中。结果是每次我发出请求时都会收到 HTTP 错误 401。这似乎是授权问题。

测试功能

/**
* function to test the API
* @returns {Observable<Response>}
*/
getIssue(): Observable<Response> {
  const api_token = 'XXXXXX';
  const params: URLSearchParams = new URLSearchParams();
  params.set('id', '1');
  const url = 'https://anydomain/mantisbt/api/rest/issues';

  const requestOptions = new RequestOptions({
     method: RequestMethod.Get,
     url: url,
     params: params,
     headers: new Headers({
       'Content-Type': 'application/json',
       'Authorization': api_token
     })
   });

   const req = new Request(requestOptions);
   return this.http.request(req);
}

...

this.getIssue().subscribe((result)=>{console.log(result)});

从控制台(Chrome)复制的请求标头:

:authority:XXXXXXXX
:method:OPTIONS
:path:/mantisbt/api/rest/issues?id=1
:scheme:https
accept:*/*
accept-encoding:gzip, deflate, sdch, br
accept-language:de-DE,de;q=0.8,en-US;q=0.6,en;q=0.4
access-control-request-headers:authorization,content-type
access-control-request-method:GET
dnt:1
origin:http://localhost
referer:http://localhost/login
user-agent:XXXXXXXX

我认为错误是请求标头设置不正确。例如,它们不应具有名称“访问控制请求标头”,而应仅具有“授权”名称。如何正确设置标题?

编辑:如果我将我的应用程序托管在与 mantisBT 相同的域上,则一切正常。我不明白为什么。我将header( 'Access-Control-Allow-Origin: *' ); 添加到/api/rest/index.php

编辑:这似乎是服务器端的错误。现在我得到这个错误:

XMLHttpRequest cannot load https://XXXXXX/api/rest/issues?id=1.
Response for preflight has invalid HTTP status code 401

这肯定与身份验证标头未正确发送这一事实有关。

【问题讨论】:

    标签: angular rest httprequest mantis


    【解决方案1】:

    首先创建标题和 URLSearchParams 并添加到选项中。

    let headers = new Headers();
    headers.append('Content-Type', 'application/json');
    headers.append('Authorization': api_token);
    
    let params = new URLSearchParams();
    params.set('id', '1');
    let options = new RequestOptions({ headers: headers, search: params });
    
    return this.http
        .get(url, options);
    

    【讨论】:

    • 这不起作用...我收到与以前相同的错误消息。我从 webconsole 的“网络”选项卡中读到的另一点是这些行:“请求 URL:anydomain/mantisbt/api/rest/issues?id=1 请求方法:OPTIONS 状态代码:需要 401 API 令牌”看来,授权标头未正确发送。 ..
    • 在我的项目中我使用这样的 headers.append('Authorization': 'Bearer' + mytoken);
    【解决方案2】:

    我实施了一个对我有用的修复: (我开始使用 POST 问题功能,但不是获取问题功能):

    <?php
    
    $api_url = "https://XXXXXXXXXX/api/rest/issues"; //insert api url here
    
    header('Access-Control-Allow-Origin: *');
    header('Access-Control-Allow-Headers: authorization, content-type');
    header('Access-Control-Allow-Methods: POST,GET,OPTIONS,DELETE');
    
    if (!function_exists('getallheaders')) {
        function getallheaders()
        {
            $headers = [];
            foreach ($_SERVER as $name => $value) {
                if (substr($name, 0, 5) == 'HTTP_') {
                    $headers[str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, 5)))))] = $value;
                }
            }
            return $headers;
        }
    }
    
    $headers = getallheaders();
    $method = $headers['Access-Control-Request-Method'];
    $data = file_get_contents("php://input");
    
    if (!empty($data)) {
        $method = 'POST';
    } else if (!empty($_GET)) {
        $method = 'GET';
    }
    
    switch ($method) {
        case ('POST'):
            postRequest($headers, $api_url);
            break;
        case ('GET'):
            getRequest($headers, $api_url);
            break;
        case ('DELETE'):
            break;
    }
    
    function postRequest($headers, $api_url)
    {
        // POST REQUEST
        $data = file_get_contents("php://input");
        if (!empty($data)) {
            $data = json_decode($data, true);
    
            if ($headers["Authorization"] != null) {
                $opts = [
                    "http" => [
                        "method" => "POST",
                        "header" => "Accept: application/json\r\n" .
                            "Authorization: " . $headers["Authorization"] . "\r\n",
                        "content" => http_build_query($data)
                    ]
                ];
                $context = stream_context_create($opts);
                // Open the file using the HTTP headers set above
                $file = file_get_contents($api_url, false, $context);
    
                echo $file;
            }
        }
    }
    
    function getRequest($headers, $api_url)
    {
        // GET REQUEST
    
        print_r($_GET);
        if ($headers["Authorization"] != null) {
            $opts = [
                "http" => [
                    "header" => "Accept: application/json\r\n" .
                        "Authorization: " . $headers["Authorization"] . "\r\n"
                ]
            ];
            $context = stream_context_create($opts);
            // Open the file using the HTTP headers set above
            $file = file_get_contents($api_url . "?" . http_build_query(array("id" => 10)), false, $context);
    
            echo $file;
        }
    }
    
    ?>
    

    将此脚本保存到 mantis 文件夹并使用此文件的 url 作为请求目标。我将其命名为 rest-fix.php

    【讨论】:

      猜你喜欢
      • 2021-10-05
      • 2017-05-05
      • 1970-01-01
      • 2019-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-19
      相关资源
      最近更新 更多