• Springmvc 的post请求的json格式参数


    背景:

      这两天在项目中遇到了一个问题。我的环境是springmvc4.1.9,写了几个可以用ajax请求的接口(ajax、jsonp 调用正常)。突然一时兴起就用 HTTP 请求的工具(比如火狐浏览器的插件HTTPRequester,fiddler等等)来访问一下我的接口,然后就傻眼了,传入到后台的方法不能正常得到数据。

    分析:

      这里我们只做get请求和post 请求 分析。

      1) springmvc 的配置方法不说了,保证包含<mvc:annotation-driven/> 即可。

      2) 必备的jar 必不可少。springmvc 内置的json 处理包是 jackson,完整引入方式。引入包有jackson-databind,jackson-core,jackson-annotations

    		<dependency>
    			<groupId>com.fasterxml.jackson.module</groupId>
    			<artifactId>jackson-module-jaxb-annotations</artifactId>
    			<version>${jackson.version}</version>
    		</dependency>
    

      3) 采用注解方式来实现Controller  

    package com.bkc.bpmp.modules.external.controller;
    
    import java.io.IOException;
    import java.util.Map;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestBody;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.ResponseBody;
    
    import com.bkc.bpmp.modules.external.pojo.ExternalSingleResult;
    
    
    @Controller
    @RequestMapping("/external")
    public class Test
    {
        @RequestMapping(value = "/test1")
        @ResponseBody
        public Object test1(@RequestBody String  pageData)
            throws IOException
        {
            System.out.println(pageData);
            return pageData;
        }
        
        @RequestMapping(value = "/test2")
        @ResponseBody
        public Object test2(@RequestParam String  pageData)
            throws IOException
        {
            System.out.println(pageData);
            return pageData;
        }
        
    }
    

      4)对应test2,采用的是 @RequestParam 方式获取的参数

        其参数格式就是一般 a=a&b=b 模式

        而对于test1,采用的是 @RequestBody 方式获取的参数

        其参数格式就是 json格式的字符串,{"a":"valueA","b":"valueB"}

      5)在我使用 HTTP请求工具测试 test2 的时候,一直报 415

        HTTP 415 错误 – 不支持的媒体类型(Unsupported media type)

        因为我设置的请求格式为application/json ,应该为 application/json;charset=UTF-8

      6)使用ajax 请求来测试,测试方法如下

        在TestAjax()方法中,data 是一个json 数组,用这种方式去发送请求的时候,其实本质上就是参数格式为  a=a&b=b 模式。TestAjax2() 方法,传递的则是 json 字符串

    function TestAjax() {
    	var datas = {
    					"equObjCode" : "EO_10HLB21AN001.QY-GL01.JZ-01.TY"
    				};
    	var url = "/external/test2";
    	var obj = $("#result");
    	var data = $.parseJSON(datas);
    	$.ajax({
    		type : "get",
    		async : false,
    		url : url,
    		data : data,
    		//cache : false, //默认值true
    		dataType : "jsonp",
    		jsonp : "callback",//传递给请求处理程序或页面的,用以获得jsonp回调函数名的参数名(默认为:callback)
    		jsonpCallback : "jsonpCallback",
    		//自定义的jsonp回调函数名称,默认为jQuery自动生成的随机函数名
    		//如果这里自定了jsonp的回调函数,则success函数则不起作用;否则success将起作用
    		success : function(data) {
    			obj.html(JSON.stringify(data));
    			//obj.parent().css("background","#ddd");
    		},
    		error : function(XMLHttpRequest, textStatus) {
    			obj.html(XMLHttpRequest.status + ","
    					+ XMLHttpRequest.readyState + ",error="
    					+ textStatus);
    		}
    	});
    }
    		
    function TestAjax2() {
    	var datas = {
    			"equObjCode" : "EO_10HLB21AN001.QY-GL01.JZ-01.TY"
    		};
    	var url = "/external/test1";
    	var obj = $("#result");
    	$.ajax({
    		type : "post",
    		url : url,
    		data : data,
    		dataType : "json",
              contentType : 'application/json;charset=UTF-8', success : function(data) { obj.html(JSON.stringify(data)); }, error : function(XMLHttpRequest, textStatus) { obj.html(XMLHttpRequest.status + "," + XMLHttpRequest.readyState + ",error=" + textStatus); } }); }

      

      7)

      jsonp 只支持get 请求,不支持post 请求。

      post模式下,使用@RequestBody 绑定请求对象,Spring会帮你进行协议转换,将Json、Xml协议转换成你需要的对象。

    其他参考:

    HTTP Status 415的解决方案  http://www.cnblogs.com/qq78292959/p/3761646.html

  • 相关阅读:
    哎,这两天的心情,真是太差了
    昨天跌停价冲进去,今天继续跌停
    好几天没有干正事了,是否已经堕落了?
    继续通宵加班
    Map集合的遍历方式
    List,Set,Map,propertes注入方式
    java异常捕获以及处理
    List、Set、Map、数组互转
    Java并发编程:深入剖析ThreadLocal
    Exceotion与RuntimeException的区别
  • 原文地址:https://www.cnblogs.com/panie2015/p/6387561.html
Copyright © 2020-2023  润新知