Я пытаюсь отправить данные учетных данных POST API в API через класс HttpWebRequest в C#, например, мне нужно передать «Тип содержимого: приложение/x-www-form-urlencoded» в заголовке, а затем передать "grant_type:client_credentials,client_id:ruban123,client_secret:123456" в теле, чтобы получить ответ/токен (как описано в справочнике по API).
public class DataModel
{
public string grant_type { get; set; }
public string client_id { get; set; }
public string client_secret { get; set; }
}
static void Main(string[] args)
{
try
{
DataModel dm = new DataModel();
dm.grant_type = "client_credentials";
dm.client_id = "ruban123";
dm.client_secret = "123456";
var credentials = dm.grant_type + dm.client_id + dm.client_secret;
#region Http Post
string messageUri = "https://sampleurl.apivision.com:8493/abc/oauth/token";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(messageUri);
request.Headers.Add("Authorization", "Basic " + credentials);
request.ContentType = "application/json";
request.Method = "POST";
using (var streamWriter = new StreamWriter(request.GetRequestStream()))
{
string jsonModel = Newtonsoft.Json.JsonConvert.SerializeObject(dm);
streamWriter.Write(jsonModel);
streamWriter.Flush();
streamWriter.Close();
}
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream responseStream = response.GetResponseStream();
string jsonString = null;
using (StreamReader reader = new StreamReader(responseStream))
{
jsonString = reader.ReadToEnd();
Console.WriteLine();
reader.Close();
}
#endregion Http Post
}
catch (Exception ex)
{
}
}[API REFERENCE][1]
@ Хенк Холтерман, я использую .NET Core 2.1
Вот правильно HttpWebRequest
используя:
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(pathapi);
request.Method = "POST";
string postData = "grant_type=client_credentials&client_id=ruban123&client_secret=123456";
ASCIIEncoding encoding = new ASCIIEncoding();
byte[] bytes = encoding.GetBytes(postData);
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = bytes.Length;
Stream newStream = request.GetRequestStream();
newStream.Write(bytes, 0, bytes.Length);
HttpWebResponse response = request.GetResponse() as HttpWebResponse;
Подход HttpWebRequest не актуален. Посмотрите на этот вопрос Настройка заголовка авторизации HttpClient
Я бы использовал HttpClientFactory, поскольку он обеспечивает лучшую безопасность потоков. Чтобы добавить заголовок авторизации var request = new HttpRequestMessage() { Headers = { Accept = { new MediaTypeWithQualityHeaderValue ("application/json") }, AcceptEncoding = { new StringWithQualityHeaderValue ("gzip")}, Authorization = new AuthenticationHeaderValue ("Bearer" , "") }, RequestUri = новый Uri(gatewayUrl), Method = httpMethod, };
Похоже, вы пропустили настройку свойства ContentLength HttpWebRequest. Это должно быть равное количество байтов для отправки.
Для получения дополнительной информации перейдите по этой ссылке:
Какая у вас версия .NET? Современный подход использует HttpClient.