我正在向我的控制器类请求发送请求作为内容类型:application / json和application / x-www-form-urlencoded格式它应该允许这两种类型 .
但是当我使用请求类型作为application / x-www-form-urlencoded时它正在工作但是当我使用请求应用程序/ json这个代码不起作用时它给出了400响应状态 . 如何解决这个问题 .
您需要为请求的“Content-Type” Headers 使用“使用”注释元素,并为您的请求的“Accept” Headers “生成”注释元素:
@RequestMapping(value = "/home", method = RequestMethod.POST, consumes = {"application/json", "application/x-www-form-urlencoded"}, produces = "application/json")
ref:Annotation Type RequestMapping
这些RequestMapping元素可用于Spring 4.如果使用Spring 2,则需要使用“params”元素,而不是“consume”和“produce”元素:
@RequestMapping(value = "/home", method = RequestMethod.POST, params = {"content-type=application/json", "content-type=application/x-www-form-urlencoded", "Accept=application/json"})
检查类似的问题:How do I map different values for a parameter in the same @RequestMapping in Spring MVC?
获取refrash令牌
: 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); } }
使用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 <input id="AccessToken" name="AccessToken" width="604" type="text" value="@ViewBag.AccessToken" /> <input id="Authorize" name="submit.Authorize" value="Authorize" type="submit" /> Refresh Tokensh Token <input id="RefreshToken" name="RefreshToken" width="604" type="text" value="@ViewBag.RefreshToken" /> <input id="Refresh" name="submit.Refresh" value="Refresh" type="submit" /> <input id="CallApi" name="submit.CallApi" value="Access Protected Resource API" type="submit" /> </div> <div> @ViewBag.ApiResponse </div> </form>
您可以在xml中的@RequestMapping和ViewResolver中定义consumemes属性 . 下面:
@RequestMapping(consumemes = [])
ContentNegotiatingViewResolver
4 回答
您需要为请求的“Content-Type” Headers 使用“使用”注释元素,并为您的请求的“Accept” Headers “生成”注释元素:
ref:Annotation Type RequestMapping
这些RequestMapping元素可用于Spring 4.如果使用Spring 2,则需要使用“params”元素,而不是“consume”和“produce”元素:
检查类似的问题:How do I map different values for a parameter in the same @RequestMapping in Spring MVC?
获取refrash令牌
使用Oauth2令牌
您可以在xml中的@RequestMapping和ViewResolver中定义consumemes属性 . 下面:
@RequestMapping(consumemes = [])
ContentNegotiatingViewResolver