Есть необходимость отправлять динамические структуры как в js, к примеру через тип JObject, но получаем 500 когда пробуем в веб-сервисе вернуть данный тип.

Как сделать что-то типо такого: 

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers().AddNewtonsoftJson(x => x.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore);
}

 

.net core

Нравится

2 комментария

Стас, добрый день!

Для сериализации/десериализации вы можете в сервисе использовать либу Newtonsoft.

Для этого сперва нужно добавить следующие using:

using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

После чего в методе сервиса вызвать:

var content = JsonConvert.SerializeObject(objectToSerialize);

Хочется что бы это был стандартный сериализатор, а не возвращать строку которая ещё раз будет сериализирована стандартным .net  сериализатором. 

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

Добрый день. Мне необходимо при нажатии кнопки сохранять данные в формате excel и скачивать этот файл. Данные получаю из веб сервиса в формате JSON.

Есть ли такая возможность?

Нравится

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

Добрый день, имеется лендинг работающий как отдельный сайт в IIS, идея в том чтобы в выпадающий список попадали данные из справочника в Creatio. Подскажите, как это можно реализовать?

Нравится

4 комментария

С созданием контактов в Creatio через Лэндинг разобрались, но как достать из справочника не понимаю)

В целом это описано в статье.

https://academy.terrasoft.ru/docs/user/instrumenty_crm/lendingi_i_web_f…

 

Но выпадающий список со значениями и id нужно генерировать на стороне лендинга. Если список справочных значений не меняется со временем, то это можно захардкодить. Если меняется, но редко, то лучше синхронизировать базу сайта и справочник creatio. Опять же при наличии бд на сайте. И потом из базы генерировать "код" со значениями. Третий вариант, через веб сервис/или odata каждый раз считывать значения справочника и генерировать на стороне лендинга список

Трефилов Павел Сергеевич,Спасибо, мы пробовали захардкодить но данными обязательное Контрагент поле все равно не заполняется, можно ли как-то побороть при отправке данных с лендинга? Через БП после создания не хотелось бы делать

Тут наверное делать поле "контрагент" необязательным на уровне объекта. Параллельно создавать текстовое поле контрагент, и процессом после создания пытаться искать (или создавать) контрагента по каким-то критериям. Например, если лендинг с типом "форма регистрации контакта", то там есть процесс по "поиску и созданию контакта", можно в него встроить логику с контрагентом, там доп поле на объекте создавать не нужно, его можно брать из веб формы.

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

Добрый день, коллеги! 
Настраиваю интеграцию с сервисом Ringostat

 https://help.ringostat.com/knowledge-base/article/integration-with-ringostat-via-api?_ga=2.175421226.967939475.1632121367-102122395.1627983840&_gac=1.124763256.1630405486.Cj0KCQjwpreJBhDvARIsAF1_BU3JuXmxhDLRmAZxhF9xAkJXLrFr1vFGPsRwjQzEaPlH3z4kQxz0_lsaAlGpEALw_wcB

В веб сервисах, в новосозданном методе указаны данные параметры вызова и отработки ответа

 

 

На выходе получается такая ошибка


В чем может быть проблема ? 

Нравится

1 комментарий

Данил, добрый день!
Если вы правильно настроили интеграцию, то рекомендую с помощью Postman провести дєбаг. Возможно такой запрос и должен вернуть этот результат. Необходимо протестировать отправку других запросов и посмотреть на результаты.

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

Есть JSON на 35 000+ строк.
На стороне сервера запрос принимается и обрабатывается 118 – 124 секунды.

Во время обработки запроса к нам приходит ошибка:

Received an unexpected EOF or 0 bytes from the transport stream. Trace at System.Net.ConnectStream.Read(Byte[] buffer, Int32 offset, Int32 size) at System.IO.StreamReader.ReadBuffer() at System.IO.StreamReader.ReadToEnd() at Terrasoft.Configuration.UsrCustomNamespace.UsrHelperForAuction.SendRequest[T](String api, T requestObject, Guid auctionId)

Предполагалось, что запрос завершается по таймауту и соединение разрывается раньше ответа от сервера.
На стороне сервера были увеличены таймеры. С помощью
POSTMAN запросы проходят без проблем.

В CRM при отправке запроса, HTTP Request был добавлен таймаут = 600 * 1000.

Ошибка осталась та же.

Нравится

1 комментарий

Добрый день.

Подскажите, сколько по времени занимает выполнение запроса в Postman?
Если у вас закрывается сессия до выполнения запроса, я бы рекомендовал обратить внимание на системную настройку UserSessionTimeout. Максимальное значение данной настройки - 720 мин.

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

Добрый день! Появилась необходимость создать бизнес процессы через POST-запросы. 
Используя мануал для DataServise , написал кейс такого вида: 
 

 data = {
    "columnValues": {
        "items": {
            "Account": {
                "expressionType": 2,
                "parameter": {
                    "dataValueType": 10,
                    "value": "f3f8f781-3c5b-4ecb-89ef-5c1ed4da12ga"
                },
            },
 
            "Category": {
                "expressionType": 2,
                "parameter": {
                    "dataValueType": 10,
                    "value": "1c0bc159-150a-e111-a31b-f2g4hd04c01d"
                },
            },
....
            "operationType": 1,
            "rootSchemaName": "Case"
     },
    },
}

Но при post запросе вида: 
 

h = requests.post("
https://bpm-test.ru/0/dataservice/json/Reply/InsertQuery
", headers=headers, cookies=p.cookies, data=json.dumps(data))

Появляется ошибка :

 

{'responseStatus': {'ErrorCode': 'ArgumentNullOrEmptyException', 'Message': 'Значение аргумента "name" не может быть пустым', 'Errors': []}, 'rowsAffected': -1, 'nextPrcElReady': False, 'success': False}

С чем это может быть связано? если поле name даже не присутствует 

Нравится

1 комментарий

Дмитрий, уточните, Вы спрашиваете о запуске процесса или о создании записи в каком-то разделе (в Вашем примере — Case)?

Если интересует именно первое, нужно использовать не DataService, а ProcessEngineService. Как его запускать в POST, см. тему.

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

Доброго дня, имеется bpm которая при GET запросе 0/ServiceModel/EntityDataService.svc/ContactColletion возвращает xml с контактами, можно ли GET запросом возвращать JSON и если да, то где про это написанно? Если нельзя, то как вернуть JSON для oData 3?

Нравится

3 комментария
Лучший ответ

Добавьте header к запросу

Accept: application/json;odata=verbose

Добавьте header к запросу

Accept: application/json;odata=verbose

я смог сделать это в постмане, но все же не понятно, мб подскажете возможно ли в террасофте возвращать json по обращению к uri, если можно сделать это не переписывая сервис, буду благодарен за подсказку)
условно я иду по адресу /0/ServiceModel/EntityDataService.svc/ContactCollection и мне падает 
 

{

    "d": {

        "results": [

            {

                "__metadata": {

                    "id": "http://localhost:85/0/ServiceModel/EntityDataService.svc/ContactCollect…",

                    "uri": "http://localhost:85/0/ServiceModel/EntityDataService.svc/ContactCollect…",

                    "type": "Terrasoft.Configuration.Contact"

                },

                "Photo": {

                    "__deferred": {

                        "uri": "http://localhost:85/0/ServiceModel/EntityDataService.svc/ContactCollect…"

                    }

                },

                "Owner": {

                    "__deferred": {

                        "uri": "http://localhost:85/0/ServiceModel/EntityDataService.svc/ContactCollect…"

                    }
...и т.д.

Насколько понял, только заголовком. Такой формат здесь не поддерживается: «ContactCollection?$format=json». А в OData 4 по умолчанию идёт JSON.

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

Подскажите как можно в C# сделать Serialize в json объект класса

public class ImportCreatioServiceCaseColumns
{
	[JsonPropertyName("idNumber")]
	public string IdNumber { get; set; }
	[JsonPropertyName("typeCase1Name")]
	public string TypeCase0Name { get; set; }
}
public class ImportCreatioProcessCaseColumnsOut
{
	[JsonPropertyName("schemaName")]
	public string BusinessProcessName { get; set; }
	[JsonPropertyName("parameterValues")]
	public ImportCreatioServiceCaseColumns ImportCreatioServiceCaseColumns { get; set; }
 
}

и привести его к виду 

{
	"schemaName":"KtImportCaseTransferTableInBPMTest",
	"parameterValues":
	[
		{"name":"idNumber","value":"80001019"},
		{"name":"typeCase1Name","value":"Алматы"}
	]
}

?

Это нужно что бы передать body в микровервис для запуска бизнес-процесса с параметрами POST методом.

Нравится

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

Можно подключитье  Json.NET он уже включен в коробке. Подробнее об использовании смотрите https://www.newtonsoft.com/json

 

Как то так

 

sing System;
using Newtonsoft.Json;
 
namespace JsonPrettyPrint
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            Product product = new Product
                {
                    Name = "Apple",
                    Expiry = new DateTime(2008, 12, 28),
                    Price = 3.99M,
                    Sizes = new[] { "Small", "Medium", "Large" }
                };
 
            string json = JsonConvert.SerializeObject(product, Formatting.Indented);
            Console.WriteLine(json);
 
            Product deserializedProduct = JsonConvert.DeserializeObject<Product>(json);
        }
    }
 
    internal class Product
    {
        public String[] Sizes { get; set; }
        public decimal Price { get; set; }
        public DateTime Expiry { get; set; }
        public string Name { get; set; }
    }
}

 

Не работает так как нужен именно такой формат, уже пробовал как Вы советуете 

Григорий Чех пишет:
{"name":"idNumber","value":"80001019"},

Похожий формат обсуждают тут.

 

Зверев Александр пишет:

Похожий формат обсуждают тут.

А Вы пробовали вызывать бизнес-процесс из другого приложения через post вызов передавая параметры через тело запроса? 

Александр, см. тут.

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

День добрый.

Не смог отыскать примера структуры JSON'а для DataService.

В запросе отправляю следующий Json, без блока Filters отрабатывает корректно.

{
	"RootSchemaName": "Opportunity",
	"OperationType": "Select",
	"Columns": {
		"Items": {
			"Title": {
				"Expression":{
					"ExpressionType": "SchemaColumn",
					"ColumnPath": "Title"
				}
			}
		}
	},
	"AllColumns": false,
	"IsPageable": false,
	"Filters": {
		"RootSchemaName": "Opportunity",
		"FilterType": "CompareFilter",
		"LogicalOperation": "And",
		"LeftExpression": {
			"ExpressionType": "SchemaColumn",
			"ColumnPath": "Title"
		},
		"ComparisonType": "Contain",
		"RightExpression": {
			"ExpressionType": "Parameter",
			"Parameter": "test"
		},
		"LeftExpressionCaption": "test",
		"IsAggregative": false,
		"Key": "Title filter"
	}
}

Но при попытке использовать Filters сервис дает следующий ответ.

{
    "success": false,
    "responseStatus": {
        "ErrorCode": "NullReferenceException",
        "Message": "Ссылка на объект не указывает на экземпляр объекта.",
        "Errors": []
    },
    "rowsAffected": -1,
    "nextPrcElReady": false
}

Перепробовал различные варианты, но так и не смог отыскать где ошибка в структуре. Кто сталкивался и может привести пример структуры рабочего запроса? Спасибо!

Нравится

2 комментария
Лучший ответ

Добрый день.

Попробуйте для параметра значение указать таким образом:

"Parameter":{
    "DataValueType":[Тип данных],
     "Value":"[Значение колонки]"
}

 

Добрый день.

Попробуйте для параметра значение указать таким образом:

"Parameter":{
    "DataValueType":[Тип данных],
     "Value":"[Значение колонки]"
}

 

Алла Савельева,

получилось, спасибо.

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

Доброго дня,

столкнулся с проблемой, прошу вашей помощи.

при попытке обновлении guid("UsrRegistrationStatusId") с помощью odata используя json формат полезной нагрузки получаю ошибку 

"message": "Cannot convert a primitive value to the expected type 'Edm.Guid'. See the inner exception for more details."
"message": "Guid should contain 32 digits with 4 dashes (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)."

 привожу пример

http метод put,

передаваемый json  

{
"UsrRegistrationStatusId":"a9d44061-de29-4578-9df6-d2f226573a06",
"UsrTitle":"myvalue",
"UsrFirstName":"myvalue",
"UsrLastName":"myvalue",
"UsrPreferredEmail":"myvalue@mm.mm",
"UsrDateOfBirth":"2019-04-18T11:14:26.697Z",
"UsrOccupation":"myvalue",
"UsrJobTitle":"myvalue",
"UsrCompanyPersonal":"myvalue",
"UsrComment":"myvalue",
"UsrModifiedOn":"2019-04-18T11:14:26.697Z",
"UsrPassportNumber":"myvalue",
"UsrContactNumber":"myvalue",
"UsrDateOfExpiry":"2019-04-18T11:14:26.697Z",
"UsrNationality":"myvalue",
"UsrGuestTypeId":"myvalue",
"UsrMainGuestId":"myvalue",
"UsrIsAccompanyingPerson":"myvalue",
"UsrFlightsModifiedOn":"2019-04-18T11:14:26.697Z"
}

Возможно ли сформировать поля в json  с определенным типом например Edm.Guid ? Было бы круто если покажите пример с описанием типа данных.

Спасибо за внимание!

 

 

Нравится

11 комментариев
Лучший ответ

Привидите полный код формирования запроса с установкой всех служебных заголовков и обратите внимание на примеры для c# 

Представьте Id  Guid в вашем Json как

guid'9d44061-de29-4578-9df6-d2f226573a06'

Спасибо за ответ!

но не помогло  ошибка таже,

urn запроса 0/ServiceModel/EntityDataService.svc/UsrGuestCollection(guid'3b42f755-1f62-4358-878c-47f460ab9e57')
json

{
"UsrRegistrationStatusId":"guid'a9d44061-de29-4578-9df6-d2f226573a06'"
}
полный ответ 

{
  "error": {
    "code": "4",
    "message": {
      "lang": "",
      "value": "An error occurred while processing this request."
    },
    "innererror": {
      "message": "An error occurred while processing this request.",
      "type": "System.Data.Services.DataServiceException",
      "stacktrace": "   at System.Data.Services.Serializers.ODataMessageReaderDeserializer.Deserialize(SegmentInfo segmentInfo)\r\n   at System.Data.Services.Serializers.Deserializer.HandlePutRequest()\r\n   at System.Data.Services.DataService`1.HandlePutOperation(RequestDescription description, IDataService dataService)\r\n   at System.Data.Services.DataService`1.ProcessIncomingRequest(RequestDescription description, IDataService dataService)\r\n   at System.Data.Services.DataService`1.HandleNonBatchRequest(RequestDescription description)\r\n   at System.Data.Services.DataService`1.HandleRequest()",
      "internalexception": {
        "message": "Cannot convert a primitive value to the expected type 'Edm.Guid'. See the inner exception for more details.",
        "type": "Microsoft.Data.OData.ODataException",
        "stacktrace": "   at Microsoft.Data.OData.Json.ODataJsonReaderUtils.ConvertValue(Object value, IEdmPrimitiveTypeReference primitiveTypeReference, ODataMessageReaderSettings messageReaderSettings, ODataVersion version, Boolean validateNullValue)\r\n   at Microsoft.Data.OData.Json.ODataJsonPropertyAndValueDeserializer.ReadPrimitiveValueImplementation(IEdmPrimitiveTypeReference expectedValueTypeReference, Boolean validateNullValue)\r\n   at Microsoft.Data.OData.Json.ODataJsonPropertyAndValueDeserializer.ReadNonEntityValueImplementation(IEdmTypeReference expectedTypeReference, DuplicatePropertyNamesChecker duplicatePropertyNamesChecker, CollectionWithoutExpectedTypeValidator collectionValidator, Boolean validateNullValue)\r\n   at Microsoft.Data.OData.Json.ODataJsonEntryAndFeedDeserializer.ReadEntryProperty(IODataJsonReaderEntryState entryState, IEdmProperty edmProperty)\r\n   at Microsoft.Data.OData.Json.ODataJsonEntryAndFeedDeserializer.ReadEntryContent(IODataJsonReaderEntryState entryState, IEdmNavigationProperty& navigationProperty)\r\n   at Microsoft.Data.OData.Json.ODataJsonReader.ReadAtEntryStartImplementation()\r\n   at Microsoft.Data.OData.ODataReaderCore.ReadImplementation()\r\n   at Microsoft.Data.OData.ODataReaderCore.InterceptException[T](Func`1 action)\r\n   at System.Data.Services.Serializers.EntityDeserializer.ReadEntry(ODataReader odataReader, SegmentInfo topLevelSegmentInfo)\r\n   at System.Data.Services.Serializers.EntityDeserializer.Read(SegmentInfo segmentInfo)\r\n   at System.Data.Services.Serializers.ODataMessageReaderDeserializer.Deserialize(SegmentInfo segmentInfo)",
        "internalexception": {
          "message": "Guid should contain 32 digits with 4 dashes (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx).",
          "type": "System.FormatException",
          "stacktrace": "   at System.Guid.GuidResult.SetFailure(ParseFailureKind failure, String failureMessageID, Object failureMessageFormatArgument, String failureArgumentName, Exception innerException)\r\n   at System.Guid.TryParseGuidWithDashes(String guidString, GuidResult& result)\r\n   at System.Guid.TryParseGuid(String g, GuidStyles flags, GuidResult& result)\r\n   at System.Guid..ctor(String g)\r\n   at Microsoft.Data.OData.Json.ODataJsonReaderUtils.ConvertStringValue(String stringValue, Type targetType)\r\n   at Microsoft.Data.OData.Json.ODataJsonReaderUtils.ConvertValue(Object value, IEdmPrimitiveTypeReference primitiveTypeReference, ODataMessageReaderSettings messageReaderSettings, ODataVersion version, Boolean validateNullValue)"
        }
      }
    }
  }
}

Так же обратите внимание, на формирование строка запроса, в примере изменения имени контакта с идентификатором 00000000-0000-0000-0000-000000000000 из коллекции контактов ContactCollection.

// Строка запроса:
// PUT <Адрес приложения BPMonline>/0/ServiceModel/EntityDataService.svc/ContactCollection(guid'00000000-0000-0000-0000-000000000000')
// или
// MERGE <Адрес приложения BPMonline>/0/ServiceModel/EntityDataService.svc/ContactCollection(guid'00000000-0000-0000-0000-000000000000')

Григорий Чех,

Сейчас выполняется запрос вида 

 PUT <Адрес приложения BPMonline>0/ServiceModel/EntityDataService.svc/UsrGuestCollection(guid'3b42f755-1f62-4358-878c-47f460ab9e57')

А если без двойных кавычек

Json

{
"UsrRegistrationStatusId":guid'a9d44061-de29-4578-9df6-d2f226573a06'
}

Григорий Чех,

Без двойных кавычек сработает ошибка парсинга json 

{
"UsrRegistrationStatusId":guid'a9d44061-de29-4578-9df6-d2f226573a06'
}

 "message": "Invalid JSON. A token was not recognized in the JSON content."

 

В принципе должно быть

{
"UsrRegistrationStatusId":"a9d44061-de29-4578-9df6-d2f226573a06"
}

А если попробовать поменять простое текстовое поле например Name (если оно есть в вашем объекте) запрос корректно отработает?

Григорий Чех,

Да если менять обычное текстовое поле всё проходит успешно.

Были проблемы с типами данных - числами и датой, та же ошибка с преобразованием типов, на дату решилось преобразованием строки к виду "2019-04-18T11:14:26.697Z" , с числом не получается воспроизвести.

{
"UsrRegistrationStatusId":"a9d44061-de29-4578-9df6-d2f226573a06"
}

На такой формат выводит ошибку приведенную во  2 коментарии 

Привидите полный код формирования запроса с установкой всех служебных заголовков и обратите внимание на примеры для c# 

Прошу прощёния, данном формате запрос работает корректно.
{
"UsrRegistrationStatusId":"a9d44061-de29-4578-9df6-d2f226573a06"
}
Извините что ввёл в заблуждение.
Проявилось не сразу.. запросы выполнял в rest api клиенте после перезапуска клиента данный формат успешно обновил запись.

Премного вам благодарен! Огромное спасибо за ваше время!

Есть и более сложный способ, там не просто голый Guid надо, а с упоминанием названия коллекции, как тут с полом:

{
    Name: 'John',
    BirthDate: new Date(123321123321),
    Gender: {__metadata: { uri: 'GenderCollection(guid\'FC2483F8-65B6-DF11-831A-001D60E938C6\')' }}
}

И в таком случае справочное поле пишется без Id в конце.

Больше примеров в этом обсуждении.

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