【问题标题】:How to Redirect with POST method and headers如何使用 POST 方法和标头重定向
【发布时间】:2021-04-18 07:53:34
【问题描述】:

API description here 我需要使用 c# 重定向到 API,但我需要使用 POST 方法并向其添加一些标头。 我知道重定向函数使用 GET 方法,您可以通过 html 表单使用 POST 方法,但使用 html 表单我无法添加标题。那么ajax调用是唯一的方法吗?如果是这样,你能给我一个关于如何在代码隐藏 c# 上实现这一点的示例代码吗?

我尝试了类似的方法,但我不断收到输入字符串的错误,即 ajax 调用字符串的格式不正确。

if (Request["code"] != null)
        {
            string AuthCode = Request["code"];
            var byteArray = Encoding.ASCII.GetBytes($"{clientID}:{clientSecret}");
            var clientAuthHeader = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(byteArray));
            ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
            HttpResponse response = HttpContext.Current.Response;
            response.Clear();

            string url = "https://sandbox-oauth.hellenicbank.com/token/exchange?grant_type=authorization_code&redirect_uri=" + redirectUri + "&code=" + AuthCode;
            string ajaxCall = "$.ajax({type: 'POST', url: '" + url + "', " +
            "contentType: 'application/json; charset=utf-8', " +
            "data: '', " +
            "dataType: 'json', " +
            "beforeSend: function(xhr) {xhr.setRequestHeader('Authorization', '" + clientAuthHeader.ToString() + "');}, " +
            "});";

            StringBuilder s = new StringBuilder();
            s.Append("<html>");
            s.Append("<head>");
            s.AppendFormat("<script src='https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js'></script>");
            s.Append("</head>");
            s.Append("<body>");
            s.Append("<script>");
            s.AppendFormat(ajaxCall);
            s.Append("</script></form></body></html>");
            response.Write(s.ToString());
            response.End();
            return;
        }

编辑:我使用以下代码在 c# 中尝试了 POST 请求。显然,我一定做错了什么,因为我没有收到异常或 json。

public async Task<JObject> ExhcangeToken(string header, string url)
    {
        WebRequest request = WebRequest.Create(url);
        request.Method = "POST";
        request.ContentType = "application/json";
        request.Headers.Add("Authorization", "Basic " + header);
        
        try
        {
            WebResponse response = await request.GetResponseAsync();
            using (StreamReader reader = new StreamReader(response.GetResponseStream()))
            {
                string responseContent = reader.ReadToEnd();
                JObject adResponse = Newtonsoft.Json.JsonConvert.DeserializeObject<JObject>(responseContent);
                return adResponse;
            }
        }
        catch (WebException webException)
        {
            Json = webException.ToString();
            if (webException.Response != null)
            {
                using (StreamReader reader = new StreamReader(webException.Response.GetResponseStream()))
                {
                    string responseContent = reader.ReadToEnd();
                    return Newtonsoft.Json.JsonConvert.DeserializeObject<JObject>(responseContent); ;
                }
            }
        }

        return null;
    }

编辑:好的,所以我更改了请求代码并尝试使用 RestSharp,最后,我得到了响应。问题是我收到 404 not found 错误。 这是新代码:

if (Request["code"] != null)
        {
            string AuthCode = Request["code"];
            var byteArray = Encoding.ASCII.GetBytes($"{clientID}:{clientSecret}");
            var clientAuthHeader = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(byteArray));

            string url = "https://sandbox-oauth.hellenicbank.com/token/exchange?grant_type=authorization_code&redirect_uri=" + redirectUri + "&code=" + AuthCode;
            var client = new RestClient(url);
            var request = new RestRequest();

            request.Method = Method.POST;
            request.AddHeader("Authorization", clientAuthHeader.ToString());
            request.Parameters.Clear();

            request.OnBeforeDeserialization = resp => { resp.ContentType = "application/json"; };

            var queryResult = client.Execute(request);
            return;
        }

我尝试从https://reqbin.com/ 调用API,使用我在代码中使用的相同url,它工作正常。所以,我猜测问题一定出在我使用的身份验证头上。在 API 描述中要求 [标题] 授权:基本 Base64Encode(YOUR_CLIENT_ID:YOUR_CLIENT_SECRET)。 我是否以正确的方式添加此标头?

This is the JSON response im getting

编辑:解决了。我做了这样的认证:

client.Authenticator = new HttpBasicAuthenticator(clientID, clientSecret);

成功了。我终于得到了访问令牌。非常感谢您的帮助。

【问题讨论】:

  • and the only way to use the POST method is by html form谁告诉你的?
  • 不清楚。你是说你需要使用 C# 来生成一些 JavaScript,然后通过 AJAX 调用这个 API?还是说C#本身需要调用API?因为 C#(和大多数其他编程语言)可以发出 HTTP 请求,所以没有问题。我不禁觉得你没有完全理解你想要做什么。
  • 我怀疑你应该从你的 C# 发出这个请求,因为在你的网页的 Javascript 中公开授权代码可能是一个非常的坏主意(因为任何用户都可以去阅读 Javascript 源代码,但不能阅读 C# 代码)。不过,也许 API 提供者有一些您可以参考的示例。
  • 我知道您可以使用 c# 进行 POST 请求,但我需要在发布数据时使用重定向。我也找不到通过添加标头来使用 c# 重定向和 post 方法的方法。
  • “我需要使用重定向”是什么意思。请准确地描述您希望在 POST 请求完成后发生的情况。细节很重要。

标签: c# asp.net redirect post header


【解决方案1】:

使用 RestSharp 工作

最终代码:

if (Request["code"] != null)
        {
            string AuthCode = Request["code"];

            string url = "https://sandbox-oauth.hellenicbank.com/token/exchange?grant_type=authorization_code&redirect_uri=" + redirectUri + "&code=" + AuthCode;
            var client = new RestClient(url);
            var request = new RestRequest();

            request.Method = Method.POST;
            client.Authenticator = new HttpBasicAuthenticator(clientID, clientSecret);
            request.Parameters.Clear();

            request.OnBeforeDeserialization = resp => { resp.ContentType = "application/json"; };

            var queryResult = client.Execute(request);
            return;
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-04
    • 1970-01-01
    • 1970-01-01
    • 2021-06-02
    • 1970-01-01
    相关资源
    最近更新 更多