OData

Добрый день. Скачал триал версию BPMonline. Хочу немного разобраться в структуре.

Например у меня задача изменить объект (какой либо справочник) из внешнего приложения. Отсюда(http://academy.terrasoft.ua/documents/docs/technic/SDK/7.4.0/WorkWithBpm...) я понял что это возможно, через HTTP.

Но непонятен URL к которому нужно отправить запрос. А конкретно, что такое "имя прилоджения"? Где его брать? Нужно ли гдето регистрировать? Может есть более подробная документация по этой теме или примеры?

http[s]://имя_сервера>/имя_приложения_bpm'online>/0/ServiceModel/EntityDataService.svc

Нравится

6 комментариев

Это всего лишь адрес вашего сайта, вроде https://mycompany.bpmonline.com/0/Nui/ViewModule.aspx#SectionModuleV2/CampaignSectionV2

Имя приложения - это alias application'a вашего сайта в IIS. Обычно application именуют 0, 1, 2... и т.д.

Спасибо. С этим вроде разобрался, через URL в браузере возвращается XML.

Но проблемы с авторизацией теперь, если AJAX запрос делать

var request=newRequest();
var url="https://test.bpmonline.com/0/ServiceModel/EntityDataService.svc";
var param = JSON.stringify({
"UserName":"Иванов Иван",
"UserPassword":"ХХХХХХХХ"
});
request.onreadystatechange=function()
{
if (request.readyState==4) {
if (request.status==200) {
var answer=request.responseText;
alert(answer)
}
else alert('Ошибка '+request.status+" Попробуйте еще раз!");
}
}
request.open("POST", url, true);
request.setRequestHeader("Content-Type", "application/json");
//request.setRequestHeader("Authorization", "Basic " + Base64.encode("Иванов Иван" + ":" + "ХХХХХХХХ"));
request.send(param);

Ответ: 401Unauthorized

Как правильно через AJAX авторизацию запроса сделать? Пробовал и так, и как в коммнте в коде, и прям в URL подставлял логин и пароль.

Михаил, достал для Вас следующие примеры:

Запросы на добавление данных
Для того, чтобы добавить запись, нужно послать серверу POST запрос, указав значения колонок в теле запроса. В качестве ответа придет представление созданной Entity. Ниже создается контакт, ему проставляются значения полей Id, Name, BirthDate, Gender. Данные в обе стороны передаются в формате JSON.
Пример запроса на добавление с использованием API Sencha Touch

var serviceUrl = "http://tscoredev5:88/BPMonline540Solution/0/ServiceModel/EntityDataService.svc/";
Ext.Ajax.request({
    url: serviceUrl + 'ContactCollection',
    headers: {
        'Content-Type': 'application/json',    
        'Accept': 'application/json',
        'Authorization': 'Basic ' + Ext.util.base64.encode('S.Karlo:S.Karlo')
    },
    jsonData: {
        Id: 'C624E607-C6B2-4A3D-9E6D-06E17FAA35C9',
        Name: 'John Best',
        BirthDate: new Date(123321123321),
        Gender: {__metadata: { uri: serviceUrl + 'GenderCollection(guid\'FC2483F8-65B6-DF11-831A-001D60E938C6\')' }}
    },
    method: 'POST'
});

Запросы на обновление данных
Для обновления данных нужно послать HTTP запрос с кастомным OData-специфическим типом операции MERGE. если послать запрос с типом операции PUT, то все колонки Entity, не указанные в запросе будут заполнены своими значениями по-умолчанию.
Пример запроса на обновление с использованием API Sencha Touch

var serviceUrl = "http://tscoredev5:88/BPMonline540Solution/0/ServiceModel/EntityDataService.svc/";
Ext.Ajax.request({
    url: serviceUrl + 'ContactCollection(guid\'5B62E943-155F-42CE-A41A-EFA650BAA0A0\')',
    headers: {
        'Content-Type': 'application/json',
        'Authorization': 'Basic ' + Ext.util.base64.encode('S.Karlo:S.Karlo')
    },
    jsonData: {
        Name: 'John',
        BirthDate: new Date(123321123321),
        Gender: {__metadata: { uri: 'GenderCollection(guid\'FC2483F8-65B6-DF11-831A-001D60E938C6\')' }}
    },
    method: 'MERGE'
});

Запросы на удаление данных
Тут все просто:
Пример запроса на удаление с использованием API Sencha Touch

var serviceUrl = "http://tscoredev5:88/BPMonline540Solution/0/ServiceModel/EntityDataService.svc/";
Ext.Ajax.request({
    url: this.serviceUrl + 'ContactCollection(guid\'C624E607-C6B2-4A3D-9E6D-06E17FAA35C9\')',
    headers: {
        'Authorization': 'Basic ' + Ext.util.base64.encode('S.Karlo:S.Karlo')
    },
    method: 'DELETE'
});

Спасибо заа примеры. Но проблема на данный момент с авторизацией.

Перепробовал уже все что на форуме нашел

1) Тут (http://www.community.terrasoft.ru/forum/topic/10573) описана проблема один в один, но я так понял, не решилась. Имя пользователя, на всякий случай, поменял на латиницу. Права на Операцию - "Доступ к Odata" есть, а вот на доступ к Объекту я не понял, как имнно установить. Но проблема скорее всего не в них.

2) Тут (http://www.community.terrasoft.ru/forum/topic/9613) описан достутп через PHP, а заодно попробовал обратится к серверу авторизации (..ServiceModel/AuthService.svc/Login). Ответ:{"Message":"Authentication failed.","StackTrace":null,"ExceptionType":"System.InvalidOperationException"}

В чем проблема, не представляю. Может еще какоето разрешение в админке требуется? Или дополнительные параметры авторизации, типа "WorkspaceName", "TimeZoneOffset", "Language"

Насчет прав доступа на объекты:
Вам нужно войти в Дизайнер системы –> Управление конфигурацией –> Конфигурация. В строке поиска ввести заголовок объекта и нажать ‘Enter’. Найти в результатах нужный объект и посмотреть его Название.
Перейти на вкладку «Администрирование: Доступ к объектам», применить фильтр по заголовку и найти нужный объект. Внизу, на вкладке «Доступ к объекту для внешних ресурсов» добавить доступ для сотрудника, под которым вы авторизируетесь.

Если нужно получить коллекцию, например Контактов, то даём права на Contact, а для обращения к коллекции добавляем слово «Collection» = «ContactCollection».

Показать все комментарии