Есть ли способ обойти квадратные скобки [] в URL-адресе перед вызовом URL-вызова Web SErvice API?
Все:
Есть библейское веб-приложение ASP.NET, которое я реализую. В веб-приложении Библии ASP.NET я вызываю следующий URL-адрес API стороннего веб-сервиса:
https://bibles.org/v2/passages.js?q%5B%5D=john+3:1-5&version=eng-KJVA
В веб-приложении ASP.NET у меня есть следующий код:
String populatedPassagesEndpointUri = "https://bibles.org/v2/passages.js?q[]=john+3:1-5&version=eng-KJVA";
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(populatedPassagesEndpointUri);
request.Headers[System.Net.HttpRequestHeader.Authorization] = "Basic " + Convert.ToBase64String(System.Text.Encoding.Default.GetBytes(ConfigurationManager.AppSettings.Get("APIToken") + ":" + "X"));
request.Method = "GET";
String test = String.Empty;
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
Stream dataStream = response.GetResponseStream();
StreamReader reader = new StreamReader(dataStream);
test = reader.ReadToEnd();
reader.Close();
dataStream.Close();
}
Если вы проанализируете URL-адрес API веб-службы, который я использую выше, вы заметите, что он использует квадратные скобки [], которые я считаю плохой практикой для использования в URL:
https://bibles.org/v2/passages.js?q%5B%5D=john+3:1-5&version=eng-KJVA
К сожалению, это сторонний поставщик API веб-сервисов, поэтому я ничего не могу с этим поделать. Я вынужден использовать URL с []
В любом случае я выполнил приведенный выше код в своем веб-приложении на Библии ASP.NET. Тем не менее, приведенный выше вызов URL веб-службы API дает мне ошибку 401. Это как-то связано с квадратными скобками [] в URL? Если да, есть ли способ обойти квадратные скобки [] в URL-адресе перед вызовом URL-вызова Web SErvice API?
2 ответа
Вы должны использовать это
HttpUtility.UrlEncode()
Твой код станет
String populatedPassagesEndpointUri = HttpUtility.UrlEncode("https://bibles.org/v2/passages.js?q[]=john+3:1-5&version=eng-KJVA");
закодировать URL вашего запроса.
Подобный вопрос на SO
Я предполагаю, что проблема не в URL, а в способе аутентификации, который вы используете.
Приведенный выше URL-адрес API Webservice вызывает ошибку 401
Ошибка 401 означает, что вы не прошли аутентификацию.
Я попробовал URL, который вы указали. Он принимает обычную аутентификацию, но я сомневаюсь, что вы предоставите формат.
В своем коде вы говорите, что ваше имя пользователя для базовой аутентификации - это некоторый токен API, а ваш пароль - X или что-то в этом роде. Кажется не правильно.
Область, которую возвращает ваш сервер, - это API-интерфейс ABS, а полученное сообщение об ошибке:
Требуется Авторизация
Вы должны предоставить токен API или имя пользователя и пароль для доступа к этой странице.
Поэтому я полагаю, вам следует использовать аутентификацию на основе токенов, поскольку вы получили APIToken из своего конфигурационного файла, а не useranme и пароль.
Способ аутентификации токена различен.
Это может быть что-то вроде
https://bibles.org/v2/passages.js?q[]=john+3:1-5&version=eng-KJVA&token=your API token
Или передать токен в заголовке аутентификации, как
Bearer yourAPItoken
В целом, вам нужно дважды проверить свой метод аутентификации, попытаться найти какой-нибудь документ о вашем сайте или обратиться за поддержкой на веб-сайт.
Обновить:
Причина, по которой вы получаете ошибку 401, заключается в том, что ваш исходный запрос перенаправляется, а ваш заголовок аутентификации не сохраняется после перенаправления.
Вам нужно установить свой httpWebRequest.AllowAutoRedirect = false и проверить код ответа, если = 302 найдено, создать новый запрос к месту перенаправления.
Это может помочь вам http://www.codeproject.com/Articles/49243/Handling-Cookies-with-Redirects-and-HttpWebRequest
Вот моя собственная реализация, вы можете изменить ее под свои нужды:
Во-первых, введите IHttpContextAccessor в класс, в котором вы пытаетесь реализовать этот код;
Затем используйте мой код ниже, чтобы добиться того, чего вы хотите достичь:
var request = _httpConAccessor.HttpContext.Request;
var builder = new UriBuilder();
builder.Scheme = request.Scheme;
builder.Port = request.Host.Port.GetValueOrDefault();
builder.Path = "/Home/ConfirmEmail";
var query = HttpUtility.ParseQueryString(builder.Query);
query["userId"] = user.EmailAddress;
query["token"] = user.ActivetionCode.ToString();
builder.Query = query.ToString();
string link = builder.ToString();
var link2 = HttpUtility.UrlDecode(link);
return link2;
Вывод этой функции для меня выглядит так:
https://localhost:44330/Home/ConfirmEmail?userId=myemailaddress@gmail.com&token=b5867906-7ede-44yd-adrt4-0272a5cacd
вместо того
https://[localhost:44330]/Home/ConfirmEmail?userId=myemailaddress@gmail.com&token=b5867906-7ede-44yd-adrt4-0272a5cacd
Обратите внимание на отсутствие квадратных скобок.
Удачного кодирования.