2017-06-22 56 views
1

背景:如何使用angular Http将HTTP REQUEST发送到mantisBT的REST API?

我测试服务器上安装mantisBT 2.5.0,启用REST API(这是目前在β相)。之后,我生成了一个API密钥,并试图使用/ api/rest/swagger上的swagger页面进行测试HTTP请求。这工作正常。 (我只能重命名后的.htaccess访问该页面_htaccess)

我想要做什么:

我要实现我的应用程序功能,可发送“易”错误报告而不必访问mantisBT直接。为了测试API,我实现了这个函数,它只是调用“get issue”请求。如果这有效,我可以实施一种方法来创建问题。

问题

我不能用我的API令牌添加属性“授权”我的请求的HTTP标头。结果是每次发出请求时,我都会收到一个HTTP Error 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)}); 

请求报头从控制台(铬)复制:

: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 

我认为错误是请求头设置不正确。例如,它们不应具有“access-control-request-headers”这个名称,而应该只有“Authorization”。我如何正确设置标题?

编辑:如果我在像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 

它确实与事实有关,验证头没有正确发送。

回答

0

我实现了一个修复它不工作对我来说: (我得到工作POST问题的功能,但不是GET发布功能):

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

?> 

这个脚本保存到螳螂文件夹,使用该URL作为请求目标。我把它命名为rest-fix.php

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); 
+0

不起作用...我得到和以前一样的错误信息。我从webconsole的“网络”选项卡读取的另一点是这些行: “请求URL:http:// anydomain/mantisbt/api/rest/issues?id = 1 请求方法:选项 状态代码:401 API令牌需要“ 看来,授权标头没有正确发送... – geronimo678

+0

在我的项目中,我使用像这样headers.append('授权' :'Bearer'+ mytoken); – CharanRoot

+0

你也使用mantisBT吗? – geronimo678

相关问题