2017-06-22 4 views
1

Contexte:Comment faire HTTP REQUEST à l'API REST de mantisBT en utilisant Http angulaire?

I installé sur MantisBT 2.5.0 un serveur de test, a permis à l'API REST (qui est actuellement en phase bêta). Après cela, j'ai généré une clé API et j'ai essayé de faire une demande de test HTTP en utilisant la page swagger sur/api/rest/swagger. Cela fonctionne bien. (Je ne pouvais accéder à cette page de renommer le fichier .htaccess à _htaccess)

Ce que je veux faire:

Je veux implémenter une fonctionnalité dans mon application pour permettre l'envoi de rapports de bugs « facile » sans visiter mantisBT directement. Pour tester l'API, j'ai implémenté cette fonction, qui appelle simplement une requête "get issue". Si cela fonctionne, je peux implémenter une méthode pour créer un problème.

Problème:

Je ne peux pas ajouter l'attribut « Autorisation » avec mon jeton d'API pour les en-têtes HTTP de ma demande. Le résultat est que chaque fois que je fais la demande, je reçois une erreur HTTP 401. Cela semble être un problème d'autorisation.

Fonction test:

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

tête de demande copié à partir de la console (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 

Je pense que l'erreur est que l'en-tête de demande ne sont pas réglées correctement. Ils ne devraient pas avoir le nom 'access-control-request-headers' mais plutôt 'Authorization' seulement, par exemple. Comment puis-je définir les en-têtes correctement?

EDIT: Si j'héberge mon application sur le même domaine, comme mantisBT, tout fonctionne correctement. Je ne comprends pas pourquoi. J'ai ajouté header('Access-Control-Allow-Origin: *'); à /api/rest/index.php

EDIT: Il semble qu'il y ait une erreur côté serveur. Maintenant, je reçois cette erreur:

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

Il a définitivement quelque chose à voir avec le fait que l'en-tête d'authentification n'est pas envoyé correctement.

Répondre

0

I mis en œuvre une solution qui fonctionne pour moi: (je viens de faire marcher la fonction d'émission POST, mais pas la fonction d'émission 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; 
    } 
} 

?> 

enregistrez ce script dans le dossier mante et utilisez l'URL de ce fichier comme cible de la requête. Je l'ai appelé rest-fix.php

1

créer les en-têtes et URLSearchParams en premier et ajouter aux options.

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

qui ne fonctionne pas ... Je reçois le même message d'erreur que précédemment. Un autre point que je lis de l'onglet 'réseau' de la webconsole sont ces lignes: "Demander l'URL: http: // anydomain/mantisbt/api/rest/issues?id = 1 Méthode de requête: OPTIONS Code d'état: 401 Jeton API requis " Il semble que l'en-tête Autorisation n'a pas été envoyé correctement ... – geronimo678

+0

Dans mon projet, j'utilise comme ceci headers.append ('Authorization' : 'Porteur' + mytoken); – CharanRoot

+0

Utilisez-vous aussi mantisBT? – geronimo678