【问题标题】:How to write controller class to allow content-type: application/json and application/x-www-form-urlencoded如何编写控制器类以允许内容类型:application/json 和 application/x-www-form-urlencoded
【发布时间】:2015-06-21 02:30:31
【问题描述】:

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

但是当我将请求类型用作 application/x-www-form-urlencoded 时,它可以工作,但是当我使用 request application/json 时,此代码不起作用,它会给出 400 响应状态。如何解决这个问题。

【问题讨论】:

    标签: java json spring rest


    【解决方案1】:

    您可以在@RequestMapping 中定义consumes 属性,在xml 中定义ViewResolver。 下面:

    1. @RequestMapping(consumes = [])
    2. ContentNegotiatingViewResolver

    【讨论】:

    • 我觉得不需要ViewResolver!只需“消耗”注释元素就足够了。
    【解决方案2】:

    您需要为请求的“Content-Type”标头使用“consumes”注释元素,并为请求的“Accept”标头使用“produces”注释元素:

    @RequestMapping(value = "/home",
                   method = RequestMethod.POST,
                 consumes = {"application/json", "application/x-www-form-urlencoded"},
                 produces = "application/json")
    

    参考:Annotation Type RequestMapping

    这些 RequestMapping 元素可用于 Spring 4。如果您使用 Spring 2,则需要使用“params”元素,而不是“consumes”和“produces”元素:

    @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?

    【讨论】:

    • 为此我们需要添加任何依赖...?
    • 是的,Spring 4.*,我更新了关于您的问题的答案。对于 Spring 4,请遵循本指南:spring.io/guides/gs/rest-service
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      获取刷新令牌

        :  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);
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2021-02-03
        • 2015-04-02
        • 1970-01-01
        • 1970-01-01
        • 2019-09-12
        • 2017-09-11
        • 2020-04-21
        • 2018-06-24
        • 1970-01-01
        相关资源
        最近更新 更多