使用ASP.NET的Bitrix24 Rest API发布请求

ran*_*fer 4 php c# asp.net rest bitrix

Bitrix24 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);
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用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;
}
Run Code Online (Sandbox Code Playgroud)

Dmi*_*try 5

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
Run Code Online (Sandbox Code Playgroud)

12月13日更新:

有时您不能(或不希望)将字段名称直接放入匿名对象中.所以,可以使用字典:

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