Я пытаюсь создать билет OTRS.
Тип веб-службы HTTP:REST.
var data = {
Ticket: {
Title: "123123",
TypeID: "2",
QueueID: "1",
State: "open",
PriorityID: "2",
ServiceID: "1"
},
Article: {
Subject: "123123",
Body: "Trololo",
ContentType: "text/plain; charset=utf8"
},
SessionID: 123
};
$.ajax({
url: url,
type: 'POST',
dataType: 'json',
data: JSON.stringify(data),
success: function(res) {
...
},
error: function(res) {
...
}
});
И после отправки я получил ошибку: Could not read input data.
Если я попытаюсь изменить метод на GET и изменить тип данных на JS obj, у меня будет другой
error:
ErrorCode:"TicketCreate.MissingParameter"
ErrorMessage:"TicketCreate: Ticket parameter is missing in or not valid!"
Что я делаю неправильно?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Это из-за CORS; что в основном означает, что вам не разрешено отправлять запросы POST на любой URL-адрес из вашего браузера. Если вы хотите, чтобы это было разрешено, вы должны изменить конфигурацию своего веб-сервера.
Скорее всего, вы захотите отправить запрос в OTRS REST API со стороны сервера, кстати, а не со стороны клиента. Если вы отправляете его со стороны клиента, вам необходимо сохранить токен доступа или аналогичный на клиенте, что в большинстве случаев было бы плохой идеей. Хорошим побочным эффектом является то, что это также решит вашу проблему с CORS.
Для объяснения CORS проверьте это:
Как работает заголовок Access-Control-Allow-Origin?
И для конкретного объяснения того, почему в некоторых сценариях простой JS будет работать там, где jQuery не работает:
Запрос CORS POST работает с простым javascript, но почему не с jQuery?
Ваша полезная нагрузка кажется слишком легкой. :-D Интерфейс REST OTRS ограничен и не так прост в использовании. Например, если вы хотите создать билет через curl, полезная нагрузка должна выглядеть примерно так:
curl -X POST -H "Content-Type: application/json" --data '{"UserLogin" : "ZnunyAgent","Password" : "znuny4otrs","Ticket" : {"Title" : "some ticket title","Queue" : "Postmaster","State" : "new","PriorityID" : "3","CustomerUser" : "[email protected]"},"Article" : {"Subject" : "some subject","Body" : "some body","ContentType" : "text/plain; charset=ISO-8859-15","MimeType" : "text/plain", "Charset" : "ISO-8859-15"}}' http://localhost/otrs/nph-genericinterface.pl/Webservice/1/TicketCreate
Как видите, в запросе Ajax необходимо позаботиться о следующем:
1) Поместите пользователя для аутентификации в полезную нагрузку (или сначала создайте сеанс пользователя)
2) Используйте правильный URL-адрес с настроенным идентификатором веб-сервера в URL-адресе
Следующее сработало для меня.
Я также добавил расширение Chrome для CORS, чтобы обойти ограничения CORS localhost.
var data =
{
"Ticket": {
"Title": "Rest Create",
"Type": "Support",
"Queue": "{some queue here}",
"State": "New",
"Priority": "3 Important",
"CustomerUser": "{some email here}"
},
"Article": {
"Subject": "Rest Create",
"Body": "Test",
"ContentType": "text/plain; charset=utf8"
}
};
$.ajax({
url: "http://dev-otrs-1/otrs/nph-genericinterface.pl/Webservice/{CONNECTORNAME}/Ticket?UserLogin = {USERNAME}&Password = {PASSWORD}",
type: "post",
data: JSON.stringify(data),
success: function (response) {
console.debug(response);
}
});