Есть ли способ обойти квадратные скобки [] в 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

  1. URL в квадратных скобках в webClient.DownloadString
  2. Разрешены ли квадратные скобки в URL?

Я предполагаю, что проблема не в 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

Обратите внимание на отсутствие квадратных скобок.

Удачного кодирования.

Другие вопросы по тегам