如何使用 POST 方法和 headers 重定向
How to Redirect with POST method and headers
API description here 我需要使用 c# 重定向到 API,但我需要使用 POST 方法并向其中添加一些 header。
我知道重定向函数使用 GET 方法,您可以通过 html 形式使用 POST 方法,但是对于 html 形式我无法添加 headers。那么 ajax call 是唯一的方法吗?如果是这样,你能给我一个示例代码,说明如何在代码隐藏 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;
}
我尝试使用我的代码中使用的相同 url 从 https://reqbin.com/ 调用 API,它工作正常。所以,我猜问题一定出在我使用的身份验证 header 上。在 API 描述中要求
[Headers] 授权:基本 Base64Encode(YOUR_CLIENT_ID:YOUR_CLIENT_SECRET)。
我添加这个 header 的方式是否正确?
This is the JSON response im getting
编辑:解决了。我是这样认证的:
client.Authenticator = new HttpBasicAuthenticator(clientID, clientSecret);
成功了。我终于得到了访问令牌。非常感谢您的帮助。
使用 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;
}
API description here 我需要使用 c# 重定向到 API,但我需要使用 POST 方法并向其中添加一些 header。 我知道重定向函数使用 GET 方法,您可以通过 html 形式使用 POST 方法,但是对于 html 形式我无法添加 headers。那么 ajax call 是唯一的方法吗?如果是这样,你能给我一个示例代码,说明如何在代码隐藏 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;
}
我尝试使用我的代码中使用的相同 url 从 https://reqbin.com/ 调用 API,它工作正常。所以,我猜问题一定出在我使用的身份验证 header 上。在 API 描述中要求 [Headers] 授权:基本 Base64Encode(YOUR_CLIENT_ID:YOUR_CLIENT_SECRET)。 我添加这个 header 的方式是否正确?
This is the JSON response im getting
编辑:解决了。我是这样认证的:
client.Authenticator = new HttpBasicAuthenticator(clientID, clientSecret);
成功了。我终于得到了访问令牌。非常感谢您的帮助。
使用 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;
}