Сделать Post строки в json не меняя порядок пар
От: Passerby  
Дата: 21.06.21 17:19
Оценка: :))
Есть работающий метод Pyton:
response = requests.request('post', request_url, headers=headers, data=body)

здесь body строка json. Есть заголовок KC-API-SIGN, в котором зашифрована строка, body это часть этой строки.
Как сделать то же в C#? Чтобы послать строку HttpRequestMessage или в HttpClient ее надо преобразовать в new StringContent(body) или создать new FormUrlEncodedContent(new Dictionary<string, string>... Обратное преобразование меняет порядок пар в json, поэтому сервер сравнивая часть зашифрованной строки (body) c полученной строкой выдает ошибку, что неверна зашифрованная часть. Но эта часть точно такая же как в Python, я сравнивал. С другой стороны это стандартная вещь при посылке на сервер зашифрованного запроса. Как же его сделать в C#? Пытался упорядочивать пары по алфавиту, но это ничего не дало.
На всякий случай привожу 2 варианта запроса Post, который пробовал.

1:
string url = "https://openapi-sandbox.kucoin.com/api/v1/orders";
      HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, new Uri(url));
           //...Тот же код, что в Питоне, проверял, только не добавляю заголовок, который тут быть не может request.Headers.Add("Content-Type", "application/json");
      //пробовал и request.Content = new StringContent(body, Encoding.UTF8, "application/json");
      request.Content = new StringContent(body);
      HttpResponseMessage response = await httpClient.SendAsync(request).ConfigureAwait(false);
      string message = await response.Content.ReadAsStringAsync();
//Сервер возвращает "{\"code\":\"400005\",\"msg\":\"Invalid KC-API-SIGN\"}"

2:
var client = new HttpClient();
//...Тот же код, что в Питоне, проверял, только не добавляю заголовок, который тут быть не может request.Headers.Add("Content-Type", "application/json");
var content = new FormUrlEncodedContent(new Dictionary<string, string>{{ "clientOid", clientOid.ToString() },{ "symbol","CRO-USDT" },{"price",34000.ToString() },
  { "side","buy" },{"size",0.001m.ToString(CultureInfo.InvariantCulture) },{ "timeInForce","GTC" },{"type","limit"}});

        var result = await client.PostAsync("https://openapi-sandbox.kucoin.com/api/v1/orders", content);//   
        string resultContent = await result.Content.ReadAsStringAsync();

Безрезультатно пробовал и устаревший WebRequest. Можно установить IronPython, но видел код, спрятанный в nuget, на C#.
Отредактировано 21.06.2021 17:25 Passerby . Предыдущая версия . Еще …
Отредактировано 21.06.2021 17:23 Passerby . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.