c # — пост-запрос Bitrix24 Rest API с использованием ASP.NET

Битрикс24 CRM иметь функционал webhook добавить клиентов (клиентов) в CRM. Вся документация написана на php, но я хочу использовать ASP.NET. Вот как они это делают на php:

$queryUrl  = 'https://restapi.bitrix24.ru/rest/1/31uhq2q855fk1foj/crm.lead.add.json';
$queryData = http_build_query(array(
'fields' => array(
"TITLE" => "NEW LEAD"),
'params' => array(
"REGISTER_SONET_EVENT" => "Y")
));

$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_SSL_VERIFYPEER => 0,
CURLOPT_POST => 1,
CURLOPT_HEADER => 0,
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_URL => $queryUrl,
CURLOPT_POSTFIELDS => $queryData
));

$result = curl_exec($curl);
curl_close($curl);

$result = json_decode($result, 1);

Я пытаюсь сделать то же самое, используя ASP.NET, но получаю ошибку 400 в качестве ответа. Я почти уверен, что проблема в параметрах запроса, строка const string data = @"[{""fields"":{""title"":""Test""}}]";, Я пробовал кучу комбинаций, но ничего не получалось.

const string url = @ "https://companyname.bitrix24.ru/rest/14/31uhq2q855fk1foj/crm.lead.add.json";
const string data = @"[{""fields"":{""title"":""Test""}}]";

HttpClient client = new HttpClient();
client.BaseAddress = new Uri(url);
byte[] cred = Encoding.UTF8.GetBytes("email:password");
client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Basic", Convert.ToBase64String(cred));
client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));

HttpContent content = new StringContent(data, Encoding.UTF8, "application/json");
HttpResponseMessage messge = client.PostAsync(url, content).Result;
string description;
if (messge.IsSuccessStatusCode) {
string result = messge.Content.ReadAsStringAsync().Result;
description = result;
}

4

Решение

Поддержка Bitrix24 очень «счастлива» с php и не знает о других языках 🙁 После некоторых исследований я нашел путь к анонимным объектам и json.net. Ваш пример должен выглядеть так:

var data = new {
fields = new {
TITLE = "NEW LEAD"},
@params = new {
REGISTER_SONET_EVENT = "Y"}
};
var contentText = JsonConvert.SerializeObject(data);

var content = new StringContent(contentText, Encoding.UTF8, "application/json");
// and so on with HttpClient

Обновление 13 декабря:

Иногда вы не можете (или не хотите) помещать имена полей непосредственно в анонимный объект. Итак, словарь можно использовать:

var data = new
{
ID = someId,
FIELDS = new Dictionary<string, object>()
{
[options.SomeFieldName] = fieldValue,
},
};
5

Другие решения

Я решил проблему с этим кодом:

public void CreateLead( string title, decimal opportunity, string contactName, string phoneNumber, string email )
{
try
{
string accessToken = GetNewAccessToken();

string url = string.Format( "https://{0}/rest/crm.lead.add.json", portal_name );

var data = new
{
fields = new
{
TITLE = title,
CURRENCY_ID = "RUB",
STATUS_ID = "NEW",
OPENED = "Y",
OPPORTUNITY = opportunity,
ASSIGNED_BY_ID = 46,
COMPANY_TITLE = contactName,
PHONE =  new List<PHONE>() { new PHONE() { VALUE_TYPE = "WORK", TYPE_ID = "PHONE", VALUE = phoneNumber } }.ToArray(),
EMAIL = new List<EMAIL>() { new EMAIL() { VALUE_TYPE = "WORK", TYPE_ID = "EMAIL", VALUE = email } }.ToArray()
},
@params = new
{
REGISTER_SONET_EVENT = "Y"}
};

BitrixLead lead = new BitrixLead();

lead.TITLE = title;
lead.CURRENCY_ID = "RUB";
lead.STATUS_ID = "NEW";
lead.OPENED = "Y";
lead.OPPORTUNITY = opportunity.ToString();

if (!string.IsNullOrEmpty( contactName ))
lead.COMPANY_TITLE = contactName;

if (!string.IsNullOrEmpty( phoneNumber ))
lead.PHONE = new List<PHONE>() { new PHONE() { VALUE_TYPE="WORK", TYPE_ID="PHONE", VALUE = phoneNumber }}.ToArray();

if (!string.IsNullOrEmpty( email ))
lead.EMAIL = new List<EMAIL>() { new EMAIL() { VALUE_TYPE = "WORK", TYPE_ID = "EMAIL", VALUE = email } }.ToArray();PostToAPI( url, accessToken, data );
}
catch (Exception exc)
{
}
}

private void PostToAPI( string url, string token, object data )
{
string json = Newtonsoft.Json.JsonConvert.SerializeObject( data );

var http = (HttpWebRequest)WebRequest.Create( new Uri( url ) );
http.Accept = "application/json; charset=utf-8";
http.ContentType = "application/json; charset=utf-8";
http.Method = "POST";
http.Headers.Add( "Authorization", "Bearer " + token );

UTF8Encoding encoding = new UTF8Encoding();
Byte[] bytes = encoding.GetBytes( json );

Stream newStream = http.GetRequestStream();
newStream.Write( bytes, 0, bytes.Length );
newStream.Close();

var response = http.GetResponse();
}
0

По вопросам рекламы [email protected]