珠海市文章资讯

ajax异步传值及后端接收参数的多种方式小结

2026-03-26 08:00:02 浏览次数:2
详细信息

AJAX异步传值及后端接收参数方式小结

一、前端AJAX传值方式

1. GET请求传参

// 1.1 URL查询字符串传参
$.ajax({
    url: '/api/user?id=123&name=张三',
    type: 'GET',
    success: function(response) {
        console.log(response);
    }
});

// 1.2 data属性传参(自动转为查询字符串)
$.ajax({
    url: '/api/user',
    type: 'GET',
    data: {
        id: 123,
        name: '张三',
        tags: ['前端', '后端'] // 数组会被转为 tags[]=前端&tags[]=后端
    },
    success: function(response) {
        console.log(response);
    }
});

2. POST请求传参

// 2.1 application/x-www-form-urlencoded(默认)
$.ajax({
    url: '/api/user',
    type: 'POST',
    data: {
        username: 'admin',
        password: '123456'
    },
    success: function(response) {
        console.log(response);
    }
});

// 2.2 application/json
$.ajax({
    url: '/api/user',
    type: 'POST',
    contentType: 'application/json',
    data: JSON.stringify({
        username: 'admin',
        password: '123456',
        roles: ['admin', 'user']
    }),
    success: function(response) {
        console.log(response);
    }
});

// 2.3 multipart/form-data(文件上传)
const formData = new FormData();
formData.append('username', 'admin');
formData.append('avatar', fileInput.files[0]);

$.ajax({
    url: '/api/upload',
    type: 'POST',
    data: formData,
    contentType: false, // 必须设置
    processData: false, // 必须设置
    success: function(response) {
        console.log(response);
    }
});

3. Fetch API(现代方式)

// 3.1 GET请求
fetch('/api/user?id=123')
    .then(response => response.json())
    .then(data => console.log(data));

// 3.2 POST JSON数据
fetch('/api/user', {
    method: 'POST',
    headers: {
        'Content-Type': 'application/json'
    },
    body: JSON.stringify({
        username: 'admin',
        password: '123456'
    })
})
.then(response => response.json())
.then(data => console.log(data));

// 3.3 POST FormData
const formData = new FormData();
formData.append('username', 'admin');

fetch('/api/user', {
    method: 'POST',
    body: formData
    // 注意:使用FormData时不要设置Content-Type,浏览器会自动设置
})
.then(response => response.json())
.then(data => console.log(data));

4. Axios(推荐)

// 4.1 GET请求
axios.get('/api/user', {
    params: {
        id: 123,
        name: '张三'
    }
})
.then(response => console.log(response.data));

// 4.2 POST JSON数据
axios.post('/api/user', {
    username: 'admin',
    password: '123456'
})
.then(response => console.log(response.data));

// 4.3 POST FormData
const formData = new FormData();
formData.append('username', 'admin');
formData.append('avatar', file);

axios.post('/api/upload', formData, {
    headers: {
        'Content-Type': 'multipart/form-data'
    }
})
.then(response => console.log(response.data));

二、后端接收参数方式

1. Java Spring Boot

@RestController
@RequestMapping("/api")
public class UserController {

    // 1. @RequestParam - 接收查询参数或表单参数
    @GetMapping("/user")
    public ResponseEntity<?> getUser(
            @RequestParam("id") Long id,
            @RequestParam(value = "name", required = false) String name) {
        // id为必传参数,name为可选参数
        return ResponseEntity.ok(userService.getUser(id));
    }

    // 2. @PathVariable - 接收路径参数
    @GetMapping("/user/{id}")
    public ResponseEntity<?> getUserById(@PathVariable("id") Long id) {
        return ResponseEntity.ok(userService.getUser(id));
    }

    // 3. @RequestBody - 接收JSON请求体
    @PostMapping("/user")
    public ResponseEntity<?> createUser(@RequestBody UserDTO userDTO) {
        // UserDTO需要与前端JSON结构对应
        return ResponseEntity.ok(userService.createUser(userDTO));
    }

    // 4. 接收表单数据(不用@RequestBody)
    @PostMapping("/user/form")
    public ResponseEntity<?> createUserForm(
            @RequestParam("username") String username,
            @RequestParam("password") String password) {
        // 适用于application/x-www-form-urlencoded
        return ResponseEntity.ok("Success");
    }

    // 5. @ModelAttribute - 绑定对象属性
    @PostMapping("/user/model")
    public ResponseEntity<?> createUserModel(@ModelAttribute User user) {
        // 自动将请求参数绑定到User对象的属性
        return ResponseEntity.ok(userService.createUser(user));
    }

    // 6. MultipartFile - 接收文件
    @PostMapping("/upload")
    public ResponseEntity<?> uploadFile(
            @RequestParam("file") MultipartFile file,
            @RequestParam("description") String description) {
        // 处理文件上传
        return ResponseEntity.ok("Upload success");
    }

    // 7. 接收数组或集合参数
    @GetMapping("/users")
    public ResponseEntity<?> getUsersByIds(
            @RequestParam("ids") List<Long> ids) {
        // 前端传参:/api/users?ids=1,2,3 或 /api/users?ids=1&ids=2&ids=3
        return ResponseEntity.ok(userService.getUsersByIds(ids));
    }

    // 8. @RequestHeader - 接收请求头
    @GetMapping("/user/header")
    public ResponseEntity<?> getUserWithHeader(
            @RequestHeader("Authorization") String token) {
        return ResponseEntity.ok(userService.getUserByToken(token));
    }

    // 9. HttpServletRequest - 获取原始请求
    @PostMapping("/user/raw")
    public ResponseEntity<?> createUserRaw(HttpServletRequest request) {
        Map<String, String[]> params = request.getParameterMap();
        // 手动处理参数
        return ResponseEntity.ok("Success");
    }
}

2. Python Flask

from flask import Flask, request, jsonify
import json

app = Flask(__name__)

# 1. 接收查询参数
@app.route('/api/user', methods=['GET'])
def get_user():
    user_id = request.args.get('id')  # 获取单个参数
    name = request.args.get('name', 'default')  # 带默认值
    # 获取所有参数
    all_args = request.args.to_dict()
    return jsonify({'id': user_id, 'name': name})

# 2. 接收路径参数
@app.route('/api/user/<int:user_id>', methods=['GET'])
def get_user_by_id(user_id):
    return jsonify({'id': user_id})

# 3. 接收JSON数据
@app.route('/api/user', methods=['POST'])
def create_user():
    data = request.get_json()  # 自动解析JSON
    username = data.get('username')
    password = data.get('password')
    return jsonify({'message': 'User created', 'data': data})

# 4. 接收表单数据
@app.route('/api/user/form', methods=['POST'])
def create_user_form():
    username = request.form.get('username')
    password = request.form.get('password')
    return jsonify({'username': username})

# 5. 接收文件
@app.route('/api/upload', methods=['POST'])
def upload_file():
    file = request.files.get('file')
    description = request.form.get('description')
    if file:
        file.save(f'uploads/{file.filename}')
    return jsonify({'message': 'Upload success'})

# 6. 接收数组参数
@app.route('/api/users', methods=['GET'])
def get_users():
    ids = request.args.getlist('ids')  # 获取数组参数
    return jsonify({'ids': ids})

# 7. 获取请求头
@app.route('/api/user/header', methods=['GET'])
def get_user_header():
    token = request.headers.get('Authorization')
    return jsonify({'token': token})

if __name__ == '__main__':
    app.run(debug=True)

3. Node.js Express

const express = require('express');
const app = express();
const bodyParser = require('body-parser');
const multer = require('multer');
const upload = multer({ dest: 'uploads/' });

// 中间件配置
app.use(bodyParser.json()); // 解析 application/json
app.use(bodyParser.urlencoded({ extended: true })); // 解析 application/x-www-form-urlencoded

// 1. 接收查询参数
app.get('/api/user', (req, res) => {
    const { id, name } = req.query;
    res.json({ id, name });
});

// 2. 接收路径参数
app.get('/api/user/:id', (req, res) => {
    const userId = req.params.id;
    res.json({ id: userId });
});

// 3. 接收JSON数据
app.post('/api/user', (req, res) => {
    const { username, password } = req.body;
    res.json({ username, password });
});

// 4. 接收表单数据
app.post('/api/user/form', (req, res) => {
    const { username, password } = req.body;
    res.json({ username, password });
});

// 5. 接收文件(单文件)
app.post('/api/upload', upload.single('file'), (req, res) => {
    const file = req.file;
    const description = req.body.description;
    res.json({ 
        message: 'Upload success',
        filename: file.filename,
        description
    });
});

// 6. 接收文件(多文件)
app.post('/api/upload/multiple', upload.array('files', 5), (req, res) => {
    const files = req.files;
    res.json({ message: `Uploaded ${files.length} files` });
});

// 7. 接收数组参数
app.get('/api/users', (req, res) => {
    const ids = req.query.ids;
    // ids可能是字符串或数组
    const idArray = Array.isArray(ids) ? ids : [ids];
    res.json({ ids: idArray });
});

// 8. 获取请求头
app.get('/api/user/header', (req, res) => {
    const token = req.headers.authorization;
    res.json({ token });
});

// 9. 原始请求处理
app.post('/api/user/raw', (req, res) => {
    let body = '';
    req.on('data', chunk => {
        body += chunk.toString();
    });
    req.on('end', () => {
        // 手动解析body
        res.json({ rawData: body });
    });
});

app.listen(3000, () => {
    console.log('Server running on port 3000');
});

4. PHP

<?php
// 1. 接收GET参数
$id = $_GET['id'] ?? null;
$name = $_GET['name'] ?? 'default';

// 2. 接收POST表单参数
$username = $_POST['username'] ?? null;
$password = $_POST['password'] ?? null;

// 3. 接收JSON数据
$jsonData = json_decode(file_get_contents('php://input'), true);
$username = $jsonData['username'] ?? null;

// 4. 接收文件
if (isset($_FILES['file'])) {
    $file = $_FILES['file'];
    move_uploaded_file($file['tmp_name'], 'uploads/' . $file['name']);
}

// 5. 接收数组参数
$ids = $_GET['ids'] ?? [];
if (!is_array($ids)) {
    $ids = [$ids];
}

// 6. 获取请求头
$token = $_SERVER['HTTP_AUTHORIZATION'] ?? '';

// 响应JSON
header('Content-Type: application/json');
echo json_encode([
    'id' => $id,
    'username' => $username,
    'token' => $token
]);
?>

三、常见问题与解决方案

1. 参数接收失败

2. 中文乱码问题

3. 文件上传大小限制

4. 跨域请求问题

四、最佳实践建议

RESTful API设计:

参数验证:

安全性考虑:

前后端协作:

性能优化:

五、调试技巧

浏览器开发者工具:

后端日志:

API测试工具:

前端调试:

总结

AJAX异步传值和后端接收参数的方式多样,选择合适的方式取决于具体需求:

理解各种传参方式的原理和适用场景,能够帮助开发者构建更健壮、高效的Web应用。

相关推荐