$.ajax 中关于get、post 与@RequestBody和@RequestParam使用注意

$.ajax里关于get、post的@RequestBody和@RequestParam使用注意

1、在GET请求中,不能使用@RequestBody。因为往GET请求里加body是不符合规范的,不保证所有的实现都支持,所以在ajax 里注意请求方式如果用 get 后端参数不能用 @RequestBody 来接收它。(所以本人在 ajax ,或者什么表单,一般爱好用post,既安全,又能解决中文乱码问题)

2、在POST请求,可以使用@RequestBody和@RequestParam,但是如果使用@RequestBody,对于参数转化的配置必须统一。可以使用多个@RequestParam获取数据,@RequestBody不可以只能一个。

3、ajax请求默认 contentType=application/x-www-form-urlencoded;charset:utf-8,此格式为表单提交格式,数据为key1=value1&key2=value2格式

不使用contentType:‘application/json;charset=UTF-8’, 则data里可以是json对象的属性

$.ajax({
	url: "",
	type: "POST",
	dataType: "JSON",
	data: {"id": 1},
	async: false,
	success: function(){
	
	}
});

注意:data 右边花括号外边是没有双引号或引号的 “” ‘’,所以data叫做 json对象,而不是叫json字符串,里面是其属性。(所以上面是不使用contentType:'application/json;charset=UTF-8’的例子)

使用contentType:'application/json;charset=UTF-8’的例子:就得使用json字符串而非 JSON 对象了

$.ajax({
	url: "",
	type: "POST",
	dataType: "JSON",
	contentType: "application/json",
	data: "{'id': "+ 1 + "}",
	async: false,
	success: function(){
	
	}
});

data 右边括号外有引号的叫 JSON 字符串

前端发送复杂JSON数据,后端使用@RequestBody接收

举例子:

$.ajax({
	url: "",
	type: "POST",
	dataType: "JSON",
	contentType: "application/json;charset=UTF-8",
	data: JSON.stringify({
		id:"1"
	}),
	async: false,
	success: function(){
	
	}
});

后端用 @RequestBody 来接收传过来的json字符串
注意:

  1. JSON.stringify 是从一个对象中解析出字符串
  2. JSON.parse是从一个字符串中解析出json(键值对)
    使用:contentType:‘application/json;charset=UTF-8’, 配合:data:JSON.stringify()

@RequestParam 介绍

主要用来接收GET请求拼接在URL后的参数,或者是POST传递,且Content-type为x-www-form-urlencoded方式。
因为不管是GET方式还是用x-www-form-urlencoded方式传递,参数都是以键值对方式拼接的,然后经过URLencoded编码,传递给服务端。
@RequestParam 只能接收简单参数类型,复杂的参数类型要用 @RequestBody 来接收,或者不加注解来接收。

@RequestBody 介绍

使用 @RequestBody 该注解,前端请求只能为 POST,因为该注解是从请求体中获得对象的。且请求头中的Content-type一般为application/json 方式。所以使用该注解能够接收 JSON 格式的数据,并且能把接收到的 JSON 数据绑定到 JAVA 对象中。复杂对象包括List,实体类,Map对象等。
在用该注解的时候有两个注意事项:

  • 一个方法中只能有一个@RequestBody注解,但是@RequestBody注解可以和@RequestParam注解一起使用,而且@RequestParam注解一个方法中可以有多个。
  • @RequestBody注解的参数类型可以是复杂对象类。

不加注解接收

  • 不加注解接收参数,参数类型可以为简单类型,也可以为复杂类型(JAVA对象等,前端传递的参数会和类中的属性名对应并且绑定)。也就是两种类型都可接收。
  • 而且GET请求和POST请求也都能接收到参数。
  • 但是POST请求时,和@RequestParam注解一样,Content-type只能为x-www-form-urlencoded。
  • 不加注解可以接收复杂对象,但是不能接收Map类型的对象。

参考:
SpringMvc–@RequestBody和@RequestParam注解以及不加注解接收参数的区别
$.ajax里关于get、post的@RequestBody和@RequestParam使用注意

### jQuery AJAX POST 提交数据在服务器端 Request 对象中的具体位置 当使用 `jQuery.ajax()` 方法以 POST 方式提交数据时,这些数据会根据请求的配置被放置到不同的地方。以下是详细的解析: #### 1. **默认情况下** 如果未指定特殊选项(如 `processData` `contentType`),则传递给 `data` 参数的内容会被序列化为 URL 编码字符串,并作为请求体的一部分发送至服务器[^3]。这种情况下,在服务器端可以访问 `Request.Body` 或者框架特定的对象(例如 ASP.NET 的 `HttpContext.Request.Form`)来获取这些参数。 ```javascript $.ajax({ url: 'example.com/api', type: 'POST', data: { key1: 'value1', key2: 'value2' } }); ``` 上述代码中,`key1=value1&key2=value2` 将成为请求负载(request payload),并通常可以在服务端通过解析表单(form-data)的方式读取它。 #### 2. **自定义 Content-Type processData 设置** 如果有如下设置: - `processData: false`: 防止自动转换传入的数据成查询字符串。 - `contentType: false`: 不设定 HTTP 请求头部字段 `Content-Type`。 这允许开发者手动控制如何构建请求主体以及其对应的 MIME 类型。比如上传二进制文件或者 JSON 数据的时候就需要这样的灵活性[^2]。 对于这种情况下的文件上传实例而言,由于采用了 `FormData` 构造函数创建了一个新的形式化的数据集,因此浏览器不会将其转化为传统的 query string 形式的 body;而是保持原始格式直接传输过去。此时应该依据实际使用的编程语言及其 web 库特性去定位相应的部分——一般也是位于 `request.body` 下面,不过可能需要用额外的方法提取 multipart/form-data 组件里的各个片段。 ```javascript var formData = new FormData(); formData.append('file', $('#uploadFile')[0].files[0]); $.ajax({ url: '/upload', type: 'POST', data: formData, processData: false, contentType: false }); ``` 在这种场景下,接收方需按照多部件编码(multipart encoding)的标准处理流程对待接收到的信息包。 #### 3. **JSON 格式的数据提交** 假如希望传送的是 JavaScript Object Notation(JSON)-style 的结构化资料,则应调整相应属性以便正确指示客户端服务端之间的协定: ```javascript $.ajax({ url: "/api", method: "POST", headers: {"Accept": "application/json", "Content-Type":"application/json"}, data: JSON.stringify({name:"John Doe"}) }) ``` 在此种情形之下,后端应当期待着从输入流里解码出 json 文本表示法所描述的消息实体。 综上所述,基于不同类型的荷载(payloads), 它们各自存放在 server-side request object 的确切部位有所差异. ### 示例代码展示 下面给出一段 PHP 脚本来演示如何捕获由 jquery 发起的不同种类 post requests 所携带过来的有效负荷(paylaods). ```php <?php if ($_SERVER['REQUEST_METHOD'] === 'POST') { if (!empty($_FILES)) { echo "Handling file upload."; $tmp_name = $_FILES["file"]["tmp_name"]; move_uploaded_file($tmp_name, "./uploads/" . basename($_FILES["file"]["name"])); } elseif (getallheaders()['Content-Type'] == 'application/json') { echo "Processing JSON Data"; $inputJSON = file_get_contents('php://input'); $input= json_decode( $inputJSON , TRUE ); //convert JSON into array foreach ($input as $key => $val){ echo "$key :$val<br>"; } }else{ echo "Standard Form Submission"; print_r($_POST); } } ?> ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值