有没有办法在调用Web SErvice API URL调用之前,将URL中的[]方括号转义?

问题描述 投票:0回答:3

所有的人。

我正在实现一个Bible ASP.NET Web Application,在Bible ASP.NET Web Application中,我调用了以下第三方Web服务。在Bible ASP.NET Web Application中,我调用了以下第三方Web服务API URL。

https:/bibles.orgv2passages.js?q[]=john+3:1-5&version=eng-KJVA。

在ASP.NET Web应用程序中,我有以下代码。

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();

}

如果你分析我上面使用的Web Service API url,你会注意到它使用了[]方括号,我认为在URL中使用方括号是一种不好的做法。

https:/bibles.orgv2passages.js?q[]=john+3:1-5&version=eng-KJVA。

遗憾的是,提供Web服务API的是第三方,所以我无能为力。 我被迫使用带有[]的URL。

在任何情况下,我在我的Bible ASP.NET Web应用程序中执行了上面的代码,然而,上面的Webservice api URL调用给了我一个401错误,这是否与URL中的[]方括号有关?如果是,在调用Web SErvice API URL调用之前,是否有办法将URL中的[]方括号转义?

asp.net web-services url httpwebrequest square-bracket
3个回答
2
投票

你应该使用这个

HttpUtility.UrlEncode()

你的代码会变成

String populatedPassagesEndpointUri = HttpUtility.UrlEncode("https://bibles.org/v2/passages.js?q[]=john+3:1-5&version=eng-KJVA");

来对你的请求的url进行编码。

关于SO的类似问题

  1. 在webClient.DownloadString中带方括号的网址
  2. URL中是否允许使用方括号?

1
投票

我想问题不在于URL,而在于你使用的认证方法。

上面的Webservice api URL调用给我的结果是 401错误

401错误表示你的认证失败。

我尝试了你提供的URL。它确实接受基本认证,但我怀疑你提供的格式。

从你的代码来看,你是说你的基本认证方式是 帐号 是一些 API令牌 ,你的密码是 X之类的. 似乎不对

你们服务器返回的境界是 ABS API 而我得到的错误信息是

需要授权

你必须提供一个API令牌或用户名和密码才能访问这个页面。

所以我想你应该使用基于令牌的认证,因为你从配置文件中得到了一个APIToken,而不是一个用户名和密码。

做token认证的方法有很多种。

它可以是这样的

https://bibles.org/v2/passages.js?q[]=john+3:1-5&version=eng-KJVA&token=your API token

或者在认证头中传递令牌,如

Bearer yourAPItoken

总的来说,你需要仔细检查你的认证方式,试着找一些关于你的网站的文件,或者向网站寻求支持。

更新一下,你收到401错误的原因是由于你原来的请求被重定向,而你的认证方式会被重定向。

你收到401错误的原因是由于你的原始请求被重定向,而你的认证头在重定向后将无法存活。

你需要设置你的httpWebRequest.AllowAutoRedirect = false ,并测试响应代码,如果发现302,创建一个新的请求到重定向位置。

这可能会帮助你 http:/www.codeproject.comArticles49243Handling-Cookies-with-Redirects-and-HttpWebRequest


0
投票

这是我自己的实现,你可以根据自己的需要进行修改。

首先,将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/[email protected]&token=b5867906-7ede-44yd-adrt4-0272a5cacd

而不是

https://[localhost:44330]/Home/[email protected]&token=b5867906-7ede-44yd-adrt4-0272a5cacd

观察一下,方括号是没有的。

快乐编码。

© www.soinside.com 2019 - 2024. All rights reserved.