Asp.net WebApi 传递json数据以及上传文件

前言

3个月前接手的 java web 项目前几天交付验收成功了,作为该项目开发组的负责人,在苦苦加班2个多月后得到公司及客户的肯定,心里那个叫高兴啊。

所做的 java web 的整体架构非常简单易懂,整个网站以前端为主体,通过ajax与后台数据交互,前后端低耦合,有些面向服务架构的味道。因为博主C#做的比较多,所以也借机用相同的方式玩一玩asp.net

这篇博客主要总结了 Asp.net WebApi 项目的前后端互传json以及上传文件的方法。

主要思路

在面向服务的架构模式中,整个网站前后端耦合度低,将前端作为主体,通过ajax与后台交换json数据。

上传文件通过input[type=‘file’]来获取file,并通过FormData传给后台。

开始

新建空web项目,添加 Web Api 引用
在这里插入图片描述

修改路由规则。打开/Appstart/WebApiConfig.cs,添加{action}段

config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{action}/{id}",
    defaults: new { id = RouteParameter.Optional }
);

   
   
  • 1
  • 2
  • 3
  • 4
  • 5

添加Controller。在Controllers文件夹里新建一个空的ApiController,取名为 UserController
在这里插入图片描述

修改UserController.cs代码为如下代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

namespace CommonAction.Controllers
{
public class UserController : ApiController
{

    public JObject Func1([FromBody]JObject postJson)
    {
        postJson.Add("success", true);
        return postJson;
    }

}

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

编写前端代码。右击项目名->添加->Html页,并将新建的html页面的代码替换为下面代码

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title></title>
</head>
<body>
    <div>
        name:<input type="text" id="name"><br />
        age:<input type="text" id="age"><br />
        <input type="button" value="submit" id="btn" οnclick="f1()" />
    </div>
    <script src="js/jquery-3.3.1.min.js"></script>
    <script>
        function f1() {
            var postData = {
                name: $("#name").val(),
                age: $("#age").val()
            };
            $.post("api/User/Func1", postData, function (resp) {
                console.log(resp);
            });
        }
    </script>
</body>
</html>

 
 
  • 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

将HtmlPage1设置为起始页面,F5键运行。待网页加载完毕后,按f12打开浏览器console,填写name以及age,点击submit按钮。可以看到浏览器console中的返回信息。

在这里插入图片描述

可以看出,代码运行的很成功。

网站的所有数据交换,都可以通过这样的方式进行:前端构造json数据,post到后台,后台接收后处理计算,并构造json返回。

但还有一种情况是需要进行文件交互。下载文件比较简单,这里只说一下上传。

文件上传

首先在html页面增加input[type=‘file’];

pic:<input type="file" id="pic">

 
 
  • 1

html的button事件更换

<input type="button" id="submit" value="submit" οnclick="f2()">

<script>
function f2() {
var formData = new FormData();
formData.append(“name”, $("#name").val());
formData.append(“age”, KaTeX parse error: Expected 'EOF', got '#' at position 3: ("#̲age").val()); …("#pic")[0].files.length > 0) {
formData.append(“pic”, $("#pic")[0].files[0]);
}
$.ajax({
method: “POST”,
url: “api/User/Func2”,
data: formData,
dataType: “json”,
contentType: false, //传文件必须!
processData: false, //传文件必须!
success: function (resp) {
console.log(resp);
},
});
}
</script>

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

增加后台代码

    public JObject Func2()
    {
        JObject returnJson = new JObject();
        var request = System.Web.HttpContext.Current.Request;
        var formData = request.Form;
        string name = formData["name"];
        string age = formData["age"];
        if (request.Files.Count > 0)
        {
            var file = request.Files[0];
            var savePath = AppDomain.CurrentDomain.SetupInformation.ApplicationBase + "uploadImgs/";
            if (!Directory.Exists(savePath)) Directory.CreateDirectory(savePath);
            file.SaveAs(savePath + file.FileName);
        }
        returnJson.Add("name", name);
        returnJson.Add("age", age);
        returnJson.Add("success", true);
        return returnJson;
    }

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

运行效果如图

在这里插入图片描述

打开项目文件夹,可以看到图片被成功保存。

在这里插入图片描述

总结

通过这两种ajax,即可完成前后端几乎所有的数据交换工作。使用这种架构,可以很好的分离前后端的工作,代码结构更清晰,写出来漂亮,写的也舒服。

若有不足请不吝赐教,感谢。

                                </div><div data-report-view="{&quot;mod&quot;:&quot;1585297308_001&quot;,&quot;dest&quot;:&quot;https://blog.csdn.net/wf824284257/article/details/83421178&quot;,&quot;extend1&quot;:&quot;pc&quot;,&quot;ab&quot;:&quot;new&quot;}"><div></div></div>
            <link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-60ecaf1f42.css" rel="stylesheet">
                                <div data-report-view="{&quot;mod&quot;:&quot;popu_387&quot;,&quot;dest&quot;:&quot;https://blog.csdn.net/wf824284257/article/details/83421178&quot;,&quot;extend1&quot;:&quot;pc&quot;,&quot;ab&quot;:&quot;new&quot;}"></div>
                    
        <div class="person-messagebox">
            <div class="left-message"><a href="https://blog.csdn.net/wf824284257">
                <img src="https://profile.csdnimg.cn/0/F/6/3_wf824284257" class="avatar_pic" username="wf824284257">
            </a></div>
            <div class="middle-message">
                                    <div class="title"><span class="tit "><a href="https://blog.csdn.net/wf824284257" data-report-click="{&quot;mod&quot;:&quot;popu_379&quot;,&quot;ab&quot;:&quot;new&quot;}" target="_blank">Fanstorm丶</a></span>
                    <!-- 等级,level -->
                                            <img class="identity-icon" src="https://csdnimg.cn/identity/blog6.png">                                            </div>
                <div class="text"><span>原创文章 151</span><span>获赞 119</span><span>访问量 35万+</span></div>
            </div>
                            <div class="right-message">
                                        <a class="btn btn-sm  bt-button personal-watch" data-report-click="{&quot;mod&quot;:&quot;popu_379&quot;,&quot;ab&quot;:&quot;new&quot;,&quot;extend1&quot;:&quot;个人信息未关注&quot;}">关注</a>
                                                            <a href="https://im.csdn.net/im/main.html?userName=wf824284257" target="_blank" class="btn btn-sm bt-button personal-letter">私信
                    </a>
                                </div>
                        </div>
                    
    </div>
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明
.NET WebAPI 中,我们可以通过多种方式接收参数。以下是其中一些常用的方式: 1. 通过 URI 中的查询字符串传递参数 我们可以使用 [FromUri] 特性来获取从 URI 中传递的参数。例如,以下代码演示了如何通过查询字符串传递参数: ```csharp public IHttpActionResult Get([FromUri] string name, [FromUri] int age) { // 处理参数 } ``` 在这个例子中,我们使用 [FromUri] 特性将 name 和 age 参数标记为从 URI 中获取。如果我们发出 GET 请求 `http://example.com/api/person?name=John&age=30`,那么 WebAPI 将正确地将 name 和 age 参数设置为 "John" 和 30。 2. 通过请求正文传递参数 我们可以使用 [FromBody] 特性将参数绑定到请求正文中的数据。例如,以下代码演示了如何使用 [FromBody] 特性传递一个自定义对象: ```csharp public IHttpActionResult Post([FromBody] Person person) { // 处理 person 对象 } ``` 在这个例子中,我们使用 [FromBody] 特性将 person 参数标记为从请求正文中获取。如果我们发送一个 POST 请求,并将以下 JSON 数据作为请求正文发送: ```json { "Name": "John", "Age": 30 } ``` 那么 WebAPI 将正确地将 person 对象设置为一个名为 "John" 年龄为 30 的 person 对象。 3. 通过请求头传递参数 我们可以使用 [FromHeader] 特性将参数绑定到请求头中的值。例如,以下代码演示了如何使用 [FromHeader] 特性传递一个字符串参数: ```csharp public IHttpActionResult Get([FromHeader] string authToken) { // 处理 authToken } ``` 在这个例子中,我们使用 [FromHeader] 特性将 authToken 参数标记为从请求头中获取。如果我们发送一个 GET 请求,并将以下请求头包含在其中: ``` authToken: 123456 ``` 那么 WebAPI 将正确地将 authToken 参数设置为 "123456"。 以上是 .NET WebAPI 中接收参数的一些常用方式,但还有其他方式可以使用。根据不同的场景和需求,我们可以使用不同的方式来接收参数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值