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

1
2
3
4
5
<dependency>
    <groupId>com.fasterxml.jackson.module</groupId>
    <artifactId>jackson-module-jaxb-annotations</artifactId>
    <version>${jackson.version}</version>
</dependency>

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
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 字符串

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
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

 

posted @   panie2015  阅读(2273)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示