2017-06-22 2 views
1

Hintergrund:Wie HTTP-REQUEST zu mantisBT REST API mit eckigen Http?

Ich installierte MantisBT 2.5.0 auf einem Testserver, aktivierte den REST-API (die derzeit in der Beta-Phase). Danach generierte ich einen API-Schlüssel und ich habe versucht, eine Test-HTTP-Anfrage unter Verwendung der Swagger-Seite an/api/rest/swagger zu machen. Das funktioniert gut. (Ich konnte nur auf diese Seite zugreifen, nachdem die .htaccess-Umbenennung in _htaccess)

Was ich tun möchte:

Ich möchte eine Funktion in meiner App implementieren, damit „easy“ Fehlerberichte zu senden, ohne den Besuch mantisBT direkt. Um die API zu testen, habe ich diese Funktion implementiert, die nur eine "Anfrage anfordern" -Aufforderung aufruft. Wenn dies funktioniert, kann ich eine Methode zum Erstellen eines Problems implementieren.

Problem:

ich das das Attribut 'Authorization' nicht hinzufügen kann, mit meinen API-Token an den HTTP-Header meiner Anfrage. Das Ergebnis ist, dass jedes Mal, wenn ich die Anfrage erstelle, ich einen HTTP-Fehler 401 erhalte. Es scheint ein Autorisierungsproblem zu sein.

Testfunktion:

/** 
* 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)}); 

Request-Header von der Konsole kopiert (Chrom):

: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 

Ich denke, der Fehler ist, dass die Request-Header nicht richtig eingestellt sind. Sie sollten nicht den Namen 'access-control-request-headers' haben, sondern beispielsweise nur 'Authorization'. Wie kann ich die Header richtig einstellen?

EDIT: Wenn ich meine app auf der gleichen Domain wie mantisBT hostet alles funktioniert gut. Ich verstehe nicht warum. Ich fügte hinzu header('Access-Control-Allow-Origin: *'); zu /api/rest/index.php

EDIT: Es scheint auf der Serverseite ein Fehler zu sein. Jetzt bekomme ich diesen Fehler:

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

Es definitiv etwas mit der Tatsache zu tun hat, dass die Authentifizierung Header nicht ordnungsgemäß gesendet wird.

Antwort

0

ich implementiert ein Update, die Arbeit für mich tut: (ich habe arbeiten, um die Funktion POST Problem, aber nicht die get Ausgabe-Funktion):

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

?> 

dieses Skript zum Gottesanbeterin Ordner speichern und Verwenden Sie die URL zu dieser Datei als Anforderungsziel. Ich nannte es rest-fix.php

1

zuerst Header und URLSearchParams erstellen und zu den Optionen hinzufügen.

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

das funktioniert nicht ... Ich bekomme die gleiche Fehlermeldung wie zuvor. Ein weiterer Punkt, den ich auf der Registerkarte 'Netzwerk' der Webkonsole gelesen habe, sind folgende Zeilen: "URL anfordern: http: // anydomain/mantisbt/api/rest/issues?ID = 1 Anforderungsmethode: OPTIONEN Statuscode: 401 API-Token erforderlich " Es scheint, dass der Berechtigungsheader nicht richtig gesendet wurde ... – geronimo678

+0

In meinem Projekt verwende ich wie dieses headers.append ('Authorization' : 'Bearer' + mytoken); – CharanRoot

+0

Benutzt du auch mantisBT? – geronimo678