首页 文章

如何编写控制器类以允许内容类型:application / json和application / x-www-form-urlencoded

提问于
浏览
0

我正在向我的控制器类请求发送请求作为内容类型:application / json和application / x-www-form-urlencoded格式它应该允许这两种类型 .

但是当我使用请求类型作为application / x-www-form-urlencoded时它正在工作但是当我使用请求应用程序/ json这个代码不起作用时它给出了400响应状态 . 如何解决这个问题 .

4 回答

  • 3

    您需要为请求的“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?

  • -2

    获取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);
        }
    }
    
  • 1

    使用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>
  • 1

    您可以在xml中的@RequestMapping和ViewResolver中定义consumemes属性 . 下面:

    • @RequestMapping(consumemes = [])

    • ContentNegotiatingViewResolver

相关问题