Bugzilla — веб-сервис через JSON-RPC

Вот что я пробовал до сих пор ..

<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-запрос. Но если я попробую тот же JS-скрипт с запросом GET, я получу следующее:

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

Запутавшись в том, как подключиться / войти в систему через веб-службы, я явно делаю что-то глупое, что-то серьезно неправильное здесь ... было бы очень полезно, если бы кто-нибудь мог помочь мне подключиться и получить информацию об ошибке. Я занимаюсь этим с тех пор, как 8-10 дней уже.. :(

К вашему сведению:

  • у меня нет доступа к серверу

  • Я настраиваю клиент и получаю доступ к серверу Bugzilla.

Другие ссылки,

Ajax-вызов

Войти

BugzillaApc

Группы Google — живое общение


person Vivek Chandra    schedule 26.07.2012    source источник


Ответы (1)


Вам нужно использовать параметры Bugzilla_login и Bugzilla_password для аутентификации каждого вызова, который будет GET с использованием jsonp. Ваш вызов будет выглядеть следующим образом, используя 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

Соответствующие документы:

person blahdiblah    schedule 31.07.2012
comment
Если я попробую приведенный выше фрагмент кода, т.е. Необработанный 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 .. - person Vivek Chandra; 01.08.2012
comment
@VivekChandra К сожалению, закодировал это слишком быстро, пожалуйста, посмотрите обновление, в котором все правильные кодировки должны быть в нужных местах. - person blahdiblah; 02.08.2012
comment
Сработало.. :) .. огромное спасибо, но есть небольшой вопрос - в Doc говорит, что принимается даже массив!, так почему строка принимается, а не тогда, когда params был массивом??.. - person Vivek Chandra; 03.08.2012
comment
Массивы @VivekChandra принимаются, но должны быть закодированы в URI. См. пример параметра ids в вызове выше. - person blahdiblah; 03.08.2012
comment
Итак, json.stringify превращает его в строку - которая закодирована URI? .. и, следовательно, это работает? .. я не знаю о кодировке URI, должен разобраться в этом .. если я ошибался!, черт. .. я должен был прочитать документ более тщательно .. :( - person Vivek Chandra; 03.08.2012
comment
@VivekChandra JSON.stringify превращает его в строку JSON, jQuery автоматически выполняет кодировку URI для объекта data. - person blahdiblah; 03.08.2012