2017-10-03 4 views
0

J'écris une application web qui peut afficher le résultat d'odeur de code du Sonarqube, mais je veux aussi qu'elle puisse parfois créer des règles personnalisées. Actuellement, je suis en mesure d'obtenir les données du serveur en utilisant HTTPClient en Java ou XMLHttpRequest en Js. Cependant, je suis vraiment bloqué sur le message POST au serveur.SonarQube Comment se connecter avec l'API Web

En Js, j'ai essayé ce code pour vous identifier: (CORS a été désactivé dans mon chrome)

request.open("POST", "http://localhost:9000/api/authentication/login?login=admin&password=admin", true); 
request.send(); 

Le code d'état de réponse est 200 qui est couronnée de succès. Cependant, lorsque je tente d'effectuer une action qui a besoin de l'autorisation

request.open("POST", "http://localhost:9000/api/qualityprofiles/copy?fromKey=" + fromKey + "&toName=" + name, true); 
request.send(); 

Le résultat est 401, non autorisé.

Après quelques recherches, j'ai changé mon code pour

var base64encodedData = ("admin:admin").toString('base64'); 
request.open("POST", "http://localhost:9000/api/qualityprofiles/copy?fromKey=" + fromKey + "&toName=" + name, true); 
request.setRequestHeader("Authorization", "Basic " + base64encodedData); 
request.send(); 

La réponse est 405, aucune méthode trouvée. Après d'autres recherches, quelqu'un a mentionné que request.withCredentials devrait être défini sur true. J'ai ajouté, puis j'ai encore eu le problème de CORS. (avec le CORS désactivé)

(Je suis un peu confus au sujet de l'API Sonarqube La raison pour laquelle je dis cela est, à mon avis, le but de cette API est de simplifier la méthode pour jouer avec le serveur Sonarqube Cependant, puisqu'il n'autorise pas CORS, cela signifie-t-il que je ne peux pas utiliser l'API sur ma propre page Web?)

Puisqu'il n'y a pas de chance dans Js, je suis passé à Java.

En Java, j'ai couru ceci: (je l'ai fait aussi bien connecte)

HttpPost post = new HttpPost("http://localhost:9000/api/qualityprofiles/copy?fromKey=AV7dToVK_BWPTtE1c9vU&toName=testtt"); 
try(CloseableHttpClient httpClient = HttpClients.createDefault(); 
      CloseableHttpResponse response = httpClient.execute(post);) { 

     System.out.println(response.getStatusLine()); 
} 

J'obtenu:

HTTP/1.1 401 

Puis-je changer mon code suivre ce lien à propos Basic Authentication with the API

CredentialsProvider provider = new BasicCredentialsProvider(); 
UsernamePasswordCredentials credentials 
    = new UsernamePasswordCredentials("admin", "admin"); 
provider.setCredentials(AuthScope.ANY, credentials); 

HttpClient client = HttpClientBuilder.create() 
     .setDefaultCredentialsProvider(provider) 
     .build(); 

HttpResponse response = client.execute(
     new HttpPost("http://localhost:9000/api/qualityprofiles/copy?fromKey=AV7dToVK_BWPTtE1c9vU&toName=testtt")); 
int statusCode = response.getStatusLine().getStatusCode(); 
System.out.println(statusCode); 

Encore une fois,En résumé, ma question est: Comment puis-je utiliser le code Java ou le code Js (préféré) pour envoyer des messages POST au serveur SonarQube avec autorisation?

Appréciez pour toute aide!

MISE À JOUR

Je suis maintenant essayer avec boucle, voici ce que je cours dans le terminal

curl -X POST -u deb3dd4152c571bcdb7b965e1d99b23a4e5c9505: http://localhost:9000/api/qualityprofiles/copy?fromKey=AV7dToVK_BWPTtE1c9vU&toName=test_file 

Et je suis arrivé cette réponse, que je ne sais pas comment

{"errors":[{"msg":"The 'toName' parameter is missing"}]} 

Deuxième mise à jour sur CURL

Je couru:

curl -X POST -F "fromKey=AV7dToVK_BWPTtE1c9vU;toName=test_file" -v -u deb3dd4152c571bcdb7b965e1d99b23a4e5c9505: http://localhost:9000/api/qualityprofiles/copy 

Résultat:

* Trying ::1... 
* Connected to localhost (::1) port 9000 (#0) 
* Server auth using Basic with user 'deb3dd4152c571bcdb7b965e1d99b23a4e5c9505' 
> POST /api/qualityprofiles/copy HTTP/1.1 
> Host: localhost:9000 
> Authorization: Basic ZGViM2RkNDE1MmM1NzFiY2RiN2I5NjVlMWQ5OWIyM2E0ZTVjOTUwNTo= 
> User-Agent: curl/7.49.1 
> Accept: */* 
> Content-Length: 179 
> Expect: 100-continue 
> Content-Type: multipart/form-data; boundary=------------------------c22bb5dd76f44ac4 
> 
< HTTP/1.1 100 
< HTTP/1.1 400 
< Content-Type: application/json 
< Content-Length: 56 
< Date: Wed, 04 Oct 2017 00:43:47 GMT 
< Connection: close 
< 
* Closing connection 0 
{"errors":[{"msg":"The 'toName' parameter is missing"}]} 
+1

Êtes-vous en mesure de vous connecter avec ces informations d'identification sur le portail Sonar? – Rizwan

+0

@Rizwan oui, j'utilise les informations de connexion par défaut qui est login: admin, pwd: admin – MaXon

+0

Je suis même capable de se connecter quand j'appelle 'request.open (" POST "," http: // localhost: 9000/api/authentification/login? Login = admin & password = admin ", true);' – MaXon

Répondre

1

Pour toute personne qui a obtenu le même problème. Je l'ai à travailler sur le code Java, voici mon code

HttpPost post = new HttpPost("http://localhost:9000/api/qualityprofiles/copy?fromKey=AV7dToVK_BWPTtE1c9vU&toName=testtt"); 
post.setHeader("Authorization", "Basic ZGViM2RkNDE1MmM1NzFiY2RiN2I5NjVlMWQ5OWIyM2E0ZTVjOTUwNTo="); 
try(CloseableHttpClient httpClient = HttpClients.createDefault(); 
     CloseableHttpResponse response = httpClient.execute(post);) { 

    System.out.println(response.getStatusLine()); 
} 

Vous remarquerez peut-être que j'ai ajouté une ligne qui définit l'en-tête. J'ai fait quelque chose de similaire avant d'encoder mon identifiant et mon mot de passe pour ce format base64, mais ils ne fonctionnent pas tous d'une manière ou d'une autre. Cette chaîne de caractères codée fonctionnait à partir de la méthode CURL. (à partir de ma deuxième mise à jour)

J'ai essayé un outil de codage et de décodage base64 en ligne, mais le résultat ne correspond pas à ce que j'ai obtenu avec la méthode CURL, donc si vous avez des difficultés, lancez CURL pour obtenir votre en-tête codé et transmettez-le! Si quelqu'un pouvait expliquer une meilleure version, ce serait génial!

En outre, je suis toujours intéressé par le fonctionnement de la version Js. Si vous connaissez la réponse, partagez s'il vous plaît!