Bugzilla - 通过 JSON-RPC 的网络服务

Posted

技术标签:

【中文标题】Bugzilla - 通过 JSON-RPC 的网络服务【英文标题】:Bugzilla - webservice via JSON-RPC 【发布时间】:2012-07-24 22:50:34 【问题描述】:

这是我到目前为止尝试过的..

<html>
  <head>
    <title>bugstats.com</title>
  </head>
<script type="text/javascript"     src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
<script type="text/javascript" src="http://jquery-json.googlecode.com/files/jquery.json-    1.3.min.js"></script>
<script type="text/javascript" >
function hello()
var myObject = "method":"User.login", /* is this the right method to call? */
"params":[   "login" :"user", /*should i include the login credentials here? */
"password" : "pass123" , 
"remember" : "True" ]  ;
var enc = $.toJSON(myObject);

$.ajax("contentType":"application/json",
    "data": enc, 
    "crossDomain":"true",
    "dataType": "json", 
    "url": "https://bugzilla.company.com/bugzilla/jsonrpc.cgi", /* is this correct or should it be https://bugzilla.company.com/bugzilla/jsonrpc.cgi?method=User.login? */ 
    "type": "POST",
    success: function()
            alert("Hallelujah");
                console.log(arguments); 

             ,
    error: function () 
    alert("Failed")
    

   );

function parseResponse(obj)
 alert("Success")
 console.log(obj)

</script>
  <body>
    <h1>bugzilla.com</h1>
    <input type="button" onclick="hello()" value="Click">
</body>

阅读此JSONPRC,并没有走远。

当我单击按钮时 - 拨打电话,登录/为此做任何事情 - 我收到以下错误 -

OPTIONS https://bugzilla.company.com/bugzilla/jsonrpc.cgi 403 (Forbidden) jquery.min.js:19
XMLHttpRequest cannot load https://bugzilla.company.com/bugzilla/jsonrpc.cgi. Origin http://172.16.229.137 is not allowed by Access-Control-Allow-Origin.

据我了解,“Access-Control-Allow-Origin”是由“同源策略”问题引起的,因此我应该使用“jsonp”。但是,Jsonp - 即脚本注入只能通过 GET 请求完成。但是,如果我使用 GET 请求尝试相同的 JS 脚本 - 我会得到以下信息:

code: 32610
message: "For security reasons, you must use HTTP POST to call the 'User.login' method."

对如何通过 Web 服务连接/登录感到困惑,我显然在这里做了一些愚蠢的事情。如果有人可以帮助我连接并获取错误详细信息,那将是一个很大的帮助。我一直从现在开始 8-10 天就开始了.. :(

仅供参考:

我无权访问服务器

我正在设置客户端并访问 Bugzilla 服务器

其他链接,

Ajax Call

Loggin In

BugzillaApc

Google Groups - Live conversation

【问题讨论】:

【参考方案1】:

您需要使用Bugzilla_loginBugzilla_password 参数来验证每个调用,这将是使用jsonp 的GET。您的调用将如下所示,以User.get 为例:

// Method parameters
var params = [
  /* The authentication parameters */
  "Bugzilla_login": "YourUserName",
  "Bugzilla_password": "YourPassword",
  /* The actual method parameters */
  "ids": [1, 2]
];
var myObject = 
  "method": "User.get",
  "params": JSON.stringify(params)
;

$.ajax("contentType": "application/json",
    "data": myObject, /* jQuery will handle URI encoding */
    "crossDomain": "true",
    "dataType": "jsonp", /* jQuery will handle adding the 'callback' parameter */
    "url": "https://bugzilla.company.com/bugzilla/jsonrpc.cgi", 
    "type": "GET",
    ...

你必须这样做,因为:

您将进行跨域调用 因为你不能设置 Access-Control-Allow-Origin 这样的东西,你必须通过 jsonp(或代理,但 jsonp 更简单)来设置 jsonp 必须是GET 请求,而不是POST

相关文档:

Connecting via GET - 您将仅限于检索信息,更改需要调用 POST。 Logging in via Bugzilla_login and Bugzilla_password

【讨论】:

如果我尝试上面的代码 sn-p,即原始 myObject 供 jQuery 处理 - 我得到错误 => code: 32000 message: "Could not parse the 'params' argument as valid JSON. Error: malformed JSON string, neither array, object, number, string or atom, at character offset 1 (before "object Object]") at Bugzilla/WebService/Server/JSONRPC.pm line 169. Value: [object Object]" ,但我给出的 json 字符串是按照规定的方法。如果我在发送之前包含toJson 方法 - 我得到please include a method before sending a request 错误出现.. @VivekChandra 哎呀,编码有点太快了,请查看更新,它应该在正确的位置包含所有正确的编码。 它工作了.. :) .. 感谢一百万,但有一个小问题 - 在Doc's 中它说即使是一个数组也被接受了!那么为什么字符串被接受而不是当 params 是一个数组时??.. @VivekChandra 数组被接受,但必须是 URI 编码的。示例见上述调用中的“ids”参数。 所以,json.stringify 将它变成一个字符串 - 这是 URI 编码的?.. 并且,因此它工作?.. 我不知道 URI 编码,得看看它.. 如果那就是我出错的地方!,该死的..我应该更彻底地阅读文档.. :(

以上是关于Bugzilla - 通过 JSON-RPC 的网络服务的主要内容,如果未能解决你的问题,请参考以下文章

如何通过retrofit2发送Json-rpc?

Yii2通过curl调用json-rpc接口

如何通过retrofit2发送Json-rpc?

使用 javascript 异步函数通过 json-rpc 请求获取 Phantom 钱包余额的问题?

无法通过 JSON-RPC 将 GETBLOCKHASH 发布到比特币核心

Ubuntu12.04 Bugzilla 和 TestOpia的安装步骤