原生JS请求API

GET方式前端- 多个参数

javascript 复制代码
// 场景:查询数据 GET方式
async function getData() {
    const params = {
        sceneId: 'order_123',
        userId: 'user_456',
        type: 'normal'
    };


    // 方式2:使用URLSearchParams(推荐)
    const queryString = new URLSearchParams(params).toString();
    const url2 = `/api/data?${queryString}`;

    const response = await fetch(url2);
    const data = await response.json();
    return data;
}

GET方式后端:

c# 复制代码
[HttpGet("data")]
public IActionResult GetData([FromQuery] SceneQueryParams query)
{
    // 直接通过对象访问
    return Ok(new { 
        query.SceneId, 
        query.UserId, 
        query.Type, 
        message = "GET请求成功" 
    });
}

POST方式-前端:

javascript 复制代码
// 场景:提交复杂对象
async function createOrder() {
    const postData = {
        sceneId: 'order_123',
        userInfo: {
            name: '张三',
            phone: '13800000000'
        },
        items: [
            { id: 1, price: 99.9 },
            { id: 2, price: 199.9 }
        ]
    };

    const response = await fetch('/api/order', {
        method: 'POST',                 // 指定POST方法
        headers: {
            'Content-Type': 'application/json'  // 声明发送JSON
        },
        body: JSON.stringify(postData)  // 序列化为JSON字符串
    });

    if (!response.ok) {
        throw new Error(`请求失败: ${response.status}`);
    }

    const result = await response.json();
    console.log('创建成功:', result);
    return result;
}

POST方式-后端:

c# 复制代码
[HttpPost("order")]
public IActionResult CreateOrder([FromBody] OrderDto dto)
{
    // dto已经自动反序列化
    return Ok(new { 
        success = true, 
        message = "订单创建成功",
        sceneCode = $"{dto.SceneId}_{Random.Shared.Next(0, 1000000).ToString("D6)}"
    });
}

再举例-修改数据:POST

后端控制器
c# 复制代码
// Controllers/SceneController.cs
[ApiController]
[Route("api/scene")]
public class SceneController : ControllerBase
{
    [HttpPost("update-code")]
    public IActionResult UpdateSceneCode([FromBody] string sceneId)
    {
        // 参数验证
        if (string.IsNullOrWhiteSpace(sceneId))
            return BadRequest(new { success = false, message = "sceneId不能为空" });

        try
        {
            // 生成场景编码
            string sceneCode = $"{sceneId}_{Random.Shared.Next(0, 1000000).ToString("D6)}";
            
            // **模拟数据库更新**(实际项目中替换为真实DB操作)
            Console.WriteLine($"[模拟数据库更新] sceneId={sceneId}, sceneCode={sceneCode}");
            
            return Ok(new { 
                success = true, 
                sceneCode, 
                message = "生成成功" 
            });
        }
        catch (Exception ex)
        {
            // 记录错误日志(实际项目中用ILogger)
            Console.WriteLine($"[错误] {ex.Message}");
            return StatusCode(500, new { success = false, message = "服务异常" });
        }
    }
}
前端JS
javascript 复制代码
// 按钮事件:传递sceneId
async function generateAndSaveSceneCode(sceneId) {
    // 验证参数
    if (!sceneId) {
        alert('sceneId不能为空');
        return;
    }

    // 显示加载状态
    const button = document.activeElement;
    if (button) button.disabled = true;

    try {
        // POST提交单个参数
        const response = await fetch('/api/scene/update-code', {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json'
            },
            body: JSON.stringify(sceneId)  // 直接序列化字符串
        });

        if (!response.ok) {
            throw new Error(`HTTP错误: ${response.status}`);
        }

        const result = await response.json();
        
        if (result.success) {
            // 成功后打开二维码页面
            const url = `/miniprogram/checkinqrcode.html?scene=${encodeURIComponent(result.sceneCode)}`;
            window.open(url, '_blank', 'noopener,noreferrer');
            
            console.log('场景编码生成成功:', result.sceneCode);
        } else {
            alert('生成失败: ' + result.message);
        }

    } catch (error) {
        console.error('操作失败:', error);
        alert('生成失败: ' + error.message);
    } finally {
        // 恢复按钮状态
        if (button) button.disabled = false;
    }
}
相关推荐
言乐61 小时前
Python游戏水平测试辅助系统
开发语言·python·游戏·django·pygame
我命由我123456 小时前
CesiumJS 笔记 - 获取容器中心点、Cartesian3 clone 方法、修改 Cartesian3 对象的高度
前端·javascript·css·前端框架·html·html5·js
抱抱宝7 小时前
Agent-study项目教程(03):手写 Mini-ReAct Agent(不依赖框架)
javascript·人工智能·gpt·react.js·prompt·agent
用户938515635078 小时前
Next.js 笔记系统(二):Redis 数据服务与侧边栏组件拆分实战
javascript·全栈
WWJA王文举8 小时前
I²C通信完整流程详解:START、地址、ACK、数据、Repeated START和STOP一次讲透
c语言·开发语言
zhanghaha13149 小时前
Python进阶教程:6_JSON 数据解析 —— 新手完全指南
开发语言·python·json
qq_4480111610 小时前
C语言中的动态内存分配
c语言·开发语言·php
汉字萌萌哒11 小时前
2024CSP-J入门级C++真题详解
开发语言·c++
arbboter11 小时前
【网络工具】NetProxy网络代理用户手册
开发语言·网络·c#·网络代理·网络异常·代理工具
Heo12 小时前
大厂前端调试不能只会debugger
前端·javascript·面试