我将请求作为内容类型发送给我的控制器类请求:application/json和application/x-www-form-urlencoded格式,它应该允许这两种类型。
但是当我使用请求类型作为应用程序/x-www-form-urlencoded时,它正在工作,但当我使用请求应用程序/json时,该代码不工作,它给出400响应状态。如何解决这个问题。
使用Oauth2令牌
: public void login()
{
string userName = "abc@mailinator.com";
string password = "Pass@123";
//var registerResult = Register(userName, password);
//Console.WriteLine("Registration Status Code: {0}", registerResult);
string token = GetToken(userName, password);
Console.WriteLine("");
Console.WriteLine("Access Token:");
Console.WriteLine(token);
Dictionary<string, string> tokenDic = GetTokenDictionary(token);
GetUserInfo(tokenDic["access_token"]);
}
private const string baseUrl = "http://localhost/WebApplication4";
static string GetToken(string userName, string password)
{
var pairs = new List<KeyValuePair<string, string>>
{
new KeyValuePair<string, string>( "grant_type", "password" ),
new KeyValuePair<string, string>( "userName", userName ),
new KeyValuePair<string, string> ( "password", password )
};
var content = new FormUrlEncodedContent(pairs);
using (var client = new HttpClient())
{
var response = client.PostAsync(baseUrl + "/Token", content).Result;
return response.Content.ReadAsStringAsync().Result;
}
}
static Dictionary<string, string> GetTokenDictionary(string token)
{
// Deserialize the JSON into a Dictionary<string, string>
Dictionary<string, string> tokenDictionary = JsonConvert.DeserializeObject<Dictionary<string, string>>(token);
return tokenDictionary;
}
static HttpClient CreateClient(string accessToken = "")
{
var client = new HttpClient();
if (!string.IsNullOrWhiteSpace(accessToken))
{
client.DefaultRequestHeaders.Authorization =
new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", accessToken);
}
return client;
}
static string GetUserInfo(string token)
{
using (var client = CreateClient(token))
{
var response = client.GetAsync(baseUrl + "/api/Account/UserInfo").Result;
return response.Content.ReadAsStringAsync().Result;
}
}
<form id="form1" action="@ViewBag.Action" method="POST">
<div>
Access Token<br />
<input id="AccessToken" name="AccessToken" width="604" type="text" value="@ViewBag.AccessToken" />
<input id="Authorize" name="submit.Authorize" value="Authorize" type="submit" />
<br />
<br />
Refresh Tokensh Token<br />
<input id="RefreshToken" name="RefreshToken" width="604" type="text" value="@ViewBag.RefreshToken" />
<input id="Refresh" name="submit.Refresh" value="Refresh" type="submit" />
<br />
<br />
<input id="CallApi" name="submit.CallApi" value="Access Protected Resource API" type="submit" />
</div>
<div>
@ViewBag.ApiResponse
</div>
</form>
获取重新刷新令牌
: public ActionResult Index()
{
ViewBag.AccessToken = Request.Form["AccessToken"] ?? "";
ViewBag.RefreshToken = Request.Form["RefreshToken"] ?? "";
ViewBag.Action = "";
ViewBag.ApiResponse = "";
InitializeWebServerClient();
var accessToken = Request.Form["AccessToken"];
if (string.IsNullOrEmpty(accessToken))
{
var authorizationState = _webServerClient.ProcessUserAuthorization(Request);
if (authorizationState != null)
{
ViewBag.AccessToken = authorizationState.AccessToken;
ViewBag.RefreshToken = authorizationState.RefreshToken;
ViewBag.Action = Request.Path;
}
}
if (!string.IsNullOrEmpty(Request.Form.Get("submit.Authorize")))
{
var userAuthorization = _webServerClient.PrepareRequestUserAuthorization(new[] { "bio", "notes" });
userAuthorization.Send(HttpContext);
Response.End();
}
else if (!string.IsNullOrEmpty(Request.Form.Get("submit.Refresh")))
{
var state = new AuthorizationState
{
AccessToken = Request.Form["AccessToken"],
RefreshToken = Request.Form["RefreshToken"]
};
if (_webServerClient.RefreshAuthorization(state))
{
ViewBag.AccessToken = state.AccessToken;
ViewBag.RefreshToken = state.RefreshToken;
}
}
else if (!string.IsNullOrEmpty(Request.Form.Get("submit.CallApi")))
{
var resourceServerUri = new Uri(Paths.ResourceServerBaseAddress);
var client = new HttpClient(_webServerClient.CreateAuthorizingHandler(accessToken));
var body = client.GetStringAsync(new Uri(resourceServerUri, Paths.MePath)).Result;
ViewBag.ApiResponse = body;
}
return View();
}
private void InitializeWebServerClient()
{
var authorizationServerUri = new Uri(Paths.AuthorizationServerBaseAddress);
var authorizationServer = new AuthorizationServerDescription
{
AuthorizationEndpoint = new Uri(authorizationServerUri, Paths.AuthorizePath),
TokenEndpoint = new Uri(authorizationServerUri, Paths.TokenPath)
};
_webServerClient = new WebServerClient(authorizationServer, Clients.Client1.Id, Clients.Client1.Secret);
}
}
您需要为请求的“内容类型”标题使用“消费”注释元素,为请求的“接受”标题使用“生产”注释元素:
@RequestMapping(value = "/home",
method = RequestMethod.POST,
consumes = {"application/json", "application/x-www-form-urlencoded"},
produces = "application/json")
ref:注释类型请求映射
这些RequestMapping元素可用于Spring4。如果使用Spring2,则需要使用“params”元素,而不是“consumes”
@RequestMapping(value = "/home",
method = RequestMethod.POST,
params = {"content-type=application/json",
"content-type=application/x-www-form-urlencoded",
"Accept=application/json"})
检查类似的问题:如何在Spring MVC中为同一个@刚需映射中的参数映射不同的值?
我正在编写一个RESTendpoint,它需要同时支持application/x-www-form-urlencoded和application/json作为请求体。我做了以下配置, 虽然它单独支持application/x-www-form-urlencoded或application/json(当我从consumes={}中注释掉一种内容类型时),但它不同时支持这两种类型。有什么想法吗?
@PostMapping public UserResponse createUser(@RequestBody UserRequest userDetail){ 这是我收到的错误代码 } 我尝试了很多不同的方法仍然没有得到解决方案这是来自邮递员的图片来自邮递员的图片
我以前有ElasticSearch 5.2,刚刚升级到6.0。 我试图创建一个索引模板以下指南在这里,但得到了错误 我的问题是
问题内容: 之间有什么区别 request.ContentType =“ application / json; charset = utf-8”; 和 webRequest.ContentType =“ application / x-www-form-urlencoded”; 问题答案: 第一种情况是告诉Web服务器您正在发布JSON数据,如下所示: 第二个选项是告诉Web服务器您将对URL中
我有一个api要求在标题中发送以下参数- 内容类型-应用程序/x-www. form-urlencoded AuthKey-(会话令牌) 以及正文中的以下参数(表单日,即键值对) storeId-1 类型-产品 类别ID-324 但是每当我点击这个api,我总是得到401(未授权)错误。我已经尝试使用MultipartRequest正文和formBody,我知道这与正文无关(它的头,我需要发送内容
问题内容: 我写了下面的@Controller方法 请求失败并出现以下错误 [PS:泽西岛要友好得多,但鉴于此处的实际限制,现在无法使用它] 问题答案: 问题在于,当我们使用application / x-www-form-urlencoded时,Spring不会将其理解为RequestBody。因此,如果要使用它,则必须删除@RequestBody批注。 然后尝试以下操作: