Вопрос или проблема
Я пытался отправить токен через метод авторизации с использованием API Key, но получал ошибку «неавторизовано»:
{StatusCode: 401, ReasonPhrase: 'Unauthorized', Version: 1.1, Content: System.Net.Http.NoWriteNoSeekStreamContent, Headers:
{
Date: Wed, 23 Oct 2024 16:35:03 GMT
Transfer-Encoding: chunked
Server: Microsoft-IIS/10.0
Content-Type: application/json; charset=utf-8
}}
Вот мой код:
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using PX.Common;
using PX.Data;
using PX.Data.BQL;
using PX.Data.BQL.Fluent;
using PX.Objects.CM;
using PX.Objects.CS;
using PX.Objects.GL;
using PX.Objects.Common.Extensions;
using PX.Objects;
using PX.Objects.IN;
using RiverlandDesarrolloV231;
using System.Net.Http;
using System.Threading.Tasks;
using Newtonsoft.Json;
using PX.Concurrency;
namespace PX.Objects.IN
{
public class INReceiptEntry_Extension : PXGraphExtension<PX.Objects.IN.INReceiptEntry>
{
#region Обработчики событий
public PXAction<INRegister> PrenderAntena;
[PXButton]
[PXUIField(DisplayName = "Включить антенну", MapEnableRights = PXCacheRights.Select, MapViewRights = PXCacheRights.Select, Enabled = true)]
protected virtual IEnumerable prenderAntena(PXAdapter adapter)
{
this.Base.LongOperationManager.StartAsyncOperation((ct) => Prueba());
return adapter.Get();
}
public static async Task Prueba()
{
var credentials = new Credentials
{
usuario = new FieldValue { value = "MyUser" },
contraseña = new FieldValue { value = "MyPassword" }
};
string jsonPayload = JsonConvert.SerializeObject(credentials, Formatting.Indented);
string url = "MyUrl";
var handler = new WinHttpHandler();
using (HttpClient client = new HttpClient(handler))
{
try
{
var requestMessage = new HttpRequestMessage(HttpMethod.Get, url);
requestMessage.Content = new StringContent(jsonPayload, Encoding.UTF8, "application/json");
HttpResponseMessage response = await client.SendAsync(requestMessage);
PXTrace.WriteInformation("Статус ответа: " + response.StatusCode.ToString());
if (response.IsSuccessStatusCode)
{
string responseContent = await response.Content.ReadAsStringAsync();
PXTrace.WriteInformation("Ответ сервера: " + responseContent.ToString());
var apiResponse = JsonConvert.DeserializeObject<ApiResponse>(responseContent);
PXTrace.WriteInformation("API key: " + apiResponse.apiKey?.value.ToString());
var receiptNbr = new ReceiptNbr
{
numeroSolicitud = new FieldValue { value = "0987654" }
};
string jsonPayload2 = JsonConvert.SerializeObject(receiptNbr, Formatting.Indented);
string url2 = "MyUrl";
var handler2 = new WinHttpHandler();
using (HttpClient client2 = new HttpClient(handler2))
{
try
{
var requestMessage2 = new HttpRequestMessage(HttpMethod.Post, url2);
requestMessage2.Content = new StringContent(jsonPayload2, Encoding.UTF8, "application/json");
client2.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Api-Key", apiResponse.apiKey?.value);
HttpResponseMessage response2 = await client.SendAsync(requestMessage2);
PXTrace.WriteInformation("Статус ответа: " + response2.StatusCode.ToString());
if (response2.IsSuccessStatusCode)
{
string responseContent2 = await response2.Content.ReadAsStringAsync();
PXTrace.WriteInformation("Ответ сервера: " + responseContent2.ToString());
var apiResponse2 = JsonConvert.DeserializeObject<ApiResponse>(responseContent2);
PXTrace.WriteInformation("API key: " + apiResponse2.apiKey?.value.ToString());
}
}
catch (HttpRequestException httpEx2)
{
PXTrace.WriteInformation("Исключение в HTTP запросе : " + httpEx2.Message);
}
catch (Exception ex2)
{
PXTrace.WriteInformation("Исключение в запросе : " + ex2.Message);
}
}
}
else
{
string errorResponse = await response.Content.ReadAsStringAsync();
PXTrace.WriteInformation("Ошибка в запросе: " + response.ReasonPhrase.ToString(), "Содержание: " + errorResponse);
}
}
catch (HttpRequestException httpEx)
{
PXTrace.WriteInformation("Исключение в HTTP запросе : " + httpEx.Message);
}
catch (Exception ex)
{
PXTrace.WriteInformation("Исключение в запросе : " + ex.Message);
}
}
}
public class ApiResponse
{
public ApiKey apiKey { get; set; }
}
public class ApiKey
{
public string value { get; set; }
}
public class Credentials
{
public FieldValue usuario { get; set; }
public FieldValue contraseña { get; set; }
}
public class FieldValue
{
public string value { get; set; }
}
public class ReceiptNbr
{
public FieldValue numeroSolicitud { get; set; }
}
#endregion
}
}
Я добавил эту строку кода, но она может не работать должным образом:
client2.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue(“Api-Key”, apiResponse.apiKey?.value);
Всё это хорошо работает в Postman:
Может кто-то помочь мне решить эту проблему?
Ответ или решение
Для того чтобы успешно отправить токен через метод авторизации API Key в POST-запросе, необходимо учесть несколько важных моментов. Рассмотрим ваш код и ошибки, которые могут быть связаны с аутентификацией.
1. Понимание проблемы
Вы сталкиваетесь с ошибкой 401 Unauthorized, что указывает на то, что сервер не смог аутентифицировать ваш запрос. Это может быть связано с неправильной конфигурацией заголовка авторизации или несоответствием API-ключа, который вы передаете.
2. Структура запроса
Ваш текущий код отправляет API Key через заголовок авторизации, но при этом следует проверить корректность его формирования. Рассмотрим изменения, которые могут помочь избежать ошибок.
3. Исправление кода
client2.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Api-Key", apiResponse.apiKey?.value);
Эта строка выглядит корректной, однако вы можете убедиться, что apiResponse.apiKey?.value
действительно содержит действительное значение ключа. Вот несколько шагов для отладки:
-
Проверьте значение API Key: Убедитесь, что
apiResponse.apiKey?.value
имеет корректное значение. Вы можете добавить дополнительный вывод перед установкой заголовка:PXTrace.WriteInformation("Полученный API ключ: " + apiResponse.apiKey?.value);
-
Проверьте наличие пробелов: Убедитесь, что значение API Key не содержит лишних пробелов или символов.
-
Проверьте правильность URL: Убедитесь, что URL (
MyUrl
), на который вы отправляете запрос, корректен и соответствует тому, что вы использовали в Postman. -
Проверьте метод запроса: У вас в коде для отправки второго запроса используется метод POST, но в вашем исходном примере вы делаете запрос с использованием метода GET при аутентификации. Убедитесь, что API поддерживает корректные методы для ваших запросов.
4. Измененный пример кода
Полный пример вашего кода с добавлением необходимых проверок:
public static async Task Prueba()
{
// Сбор учетных данных
var credentials = new Credentials
{
usuario = new FieldValue { value = "MyUser" },
contraseña = new FieldValue { value = "MyPassword" }
};
string jsonPayload = JsonConvert.SerializeObject(credentials, Formatting.Indented);
string url = "MyUrl";
using (HttpClient client = new HttpClient())
{
var requestMessage = new HttpRequestMessage(HttpMethod.Post, url);
requestMessage.Content = new StringContent(jsonPayload, Encoding.UTF8, "application/json");
// Отправка запроса
HttpResponseMessage response = await client.SendAsync(requestMessage);
if (response.IsSuccessStatusCode)
{
string responseContent = await response.Content.ReadAsStringAsync();
var apiResponse = JsonConvert.DeserializeObject<ApiResponse>(responseContent);
PXTrace.WriteInformation("API ключ: " + apiResponse.apiKey?.value);
// Подготовка для второго запроса
var receiptNbr = new ReceiptNbr { numeroSolicitud = new FieldValue { value = "0987654" } };
string jsonPayload2 = JsonConvert.SerializeObject(receiptNbr, Formatting.Indented);
string url2 = "MyUrl";
using (HttpClient client2 = new HttpClient())
{
client2.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Api-Key", apiResponse.apiKey?.value);
var requestMessage2 = new HttpRequestMessage(HttpMethod.Post, url2);
requestMessage2.Content = new StringContent(jsonPayload2, Encoding.UTF8, "application/json");
HttpResponseMessage response2 = await client2.SendAsync(requestMessage2);
PXTrace.WriteInformation("Статус ответа: " + response2.StatusCode.ToString());
if (response2.IsSuccessStatusCode)
{
string responseContent2 = await response2.Content.ReadAsStringAsync();
PXTrace.WriteInformation("Ответ сервера: " + responseContent2);
}
}
}
else
{
string errorResponse = await response.Content.ReadAsStringAsync();
PXTrace.WriteInformation("Ошибка: " + response.ReasonPhrase + " " + errorResponse);
}
}
}
5. Заключение
Следуя этим рекомендациям и проверкам, вы сможете устранить ошибки аутентификации, связанные с передачей API Key в POST-запросе. Убедитесь также, что документация API, с которым вы работаете, подтверждает правильность формата и содержания ваших запросов. Если ошибки сохраняются, обратитесь в службу поддержки API для получения дополнительной информации о причинах отказа в авторизации.