Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用Web API登录_Java_Xmlhttprequest_Sonarqube_Apache Httpclient 4.x - Fatal编程技术网

Java 如何使用Web API登录

Java 如何使用Web API登录,java,xmlhttprequest,sonarqube,apache-httpclient-4.x,Java,Xmlhttprequest,Sonarqube,Apache Httpclient 4.x,我正在编写一个web应用程序,它可以显示Sonarqube的代码气味结果,但我也希望它有时可以创建自定义规则。目前,我能够使用Java中的HTTPClient或Js中的XMLHttpRequest从服务器获取数据。然而,我真的被贴到服务器上的消息卡住了 在Js中,我尝试了以下代码登录:(我的chrome中已禁用CORS) 响应状态代码为200,成功。但是,当我尝试执行某些需要许可的操作时 request.open("POST", "http://localhost:9000/api/qualit

我正在编写一个web应用程序,它可以显示Sonarqube的代码气味结果,但我也希望它有时可以创建自定义规则。目前,我能够使用Java中的HTTPClient或Js中的XMLHttpRequest从服务器获取数据。然而,我真的被贴到服务器上的消息卡住了

在Js中,我尝试了以下代码登录:(我的chrome中已禁用CORS)

响应状态代码为
200
,成功。但是,当我尝试执行某些需要许可的操作时

request.open("POST", "http://localhost:9000/api/qualityprofiles/copy?fromKey=" + fromKey + "&toName=" + name, true);
request.send();
结果是
401
,未经授权

经过一些研究,我把代码改为

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();
响应为
405
,未找到任何方法

经过进一步研究,有人提到了
请求。withCredentials
应设置为
true
。我加入了,然后我又遇到了CORS问题。(禁用CORS时)

(我对Sonarqube API有点困惑。我之所以这么说,是因为在我看来,该API的目的是简化在外部使用Sonarqube服务器的方法。但是,由于它不允许CORS,这是否意味着我不能在自己的网页上使用该API?)

由于Js中没有运气,我转而使用Java

在Java中,我运行了以下命令:(我也完成了登录)

我得到:

HTTP/1.1 401 
然后我改变我的代码跟随这个链接关于

同样,
401

总之,我的问题是:如何使用Java代码或Js代码(首选)将消息发布到具有授权的SonarQube服务器

感谢您的帮助

更新

我现在尝试使用curl,这是我在终端中运行的

curl -X POST -u deb3dd4152c571bcdb7b965e1d99b23a4e5c9505: http://localhost:9000/api/qualityprofiles/copy?fromKey=AV7dToVK_BWPTtE1c9vU&toName=test_file
我得到了这个回答,我不知道是怎么得到的

{"errors":[{"msg":"The 'toName' parameter is missing"}]}
第二次更新CURL

我跑:

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

*   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。。。
*已连接到本地主机(::1)端口9000(#0)
*使用Basic与用户“deb3dd4152c571bcdb7b965e1d99b23a4e5c9505”进行服务器身份验证
>POST/api/qualityprofiles/copy HTTP/1.1
>主机:localhost:9000
>授权:基本ZGVIM2RKNDE1MMm1NZFIY2RIN5NJVLMWQ5OWIYM2E0ZTVJOTUWNTO=
>用户代理:curl/7.49.1
>接受:*/*
>内容长度:179
>预期:100人继续
>内容类型:多部分/表单数据;边界=---------------------------c22bb5dd76f44ac4
> 
适用于任何遇到相同问题的人。我已经让它在Java代码上工作,这是我的代码

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());
}
您可能会注意到我添加了一行设置标题。我以前也做过类似的事情,将我的登录名和密码编码为base64格式,但它们都无法正常工作。此工作编码字符串取自CURL方法。(来自我的第二次更新)

我尝试了一些在线base64编码和解码工具,但结果与我从CURL方法得到的结果不匹配,因此,如果您在这方面遇到困难,请运行CURL获取编码的头并将其传递进来!如果有人能解释一个更好的版本,那就太好了


另外,我仍然对Js版本的运行感兴趣。如果你知道答案,请分享

你能用这些凭证登录Sonar门户吗?@Rizwan是的,我使用的是默认登录信息,即login:admin,pwd:admin我甚至能在调用
请求时登录。打开(“POST”http://localhost:9000/api/authentication/login?login=admin&password=admin“,对)
当您通过java/js客户端调用时,您是否可以跟踪网络调用?Fiddler可以为您提供有关标头的详细信息。@Rizwan在响应标头中,我得到以下信息:
内容长度:0
日期:周二,2017年10月3日12:31:27格林尼治标准时间感谢这个``我尝试了一些在线base64编码和解码工具,但是结果与我从CURL方法得到的结果不匹配,因此如果您在这方面遇到困难,请运行CURL以获取编码的头并将其传递进来!如果有人能解释一个更好的版本,那就太好了```
curl -X POST -F "fromKey=AV7dToVK_BWPTtE1c9vU;toName=test_file" -v -u deb3dd4152c571bcdb7b965e1d99b23a4e5c9505: http://localhost:9000/api/qualityprofiles/copy
*   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"}]}
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());
}