受欢迎的博客标签

[原创]Asp .Net Core Web Api+MongoDB实战项目系列目录

Published

 

Table of Content

专题系列目录

  1. ASP.NET Core Web API专题之 Project Structure
  2. ASP.NET Core Web API专题之 Authentication 认证授权方式Jwt自定义实现
  3. JavaScript专题之数组去重
  4. JavaScript专题之类型判断(上)
  5. JavaScript专题之类型判断(下)
  6. JavaScript专题之深浅拷贝
  7. JavaScript专题之从零实现jQuery的extend
  8. JavaScript专题之如何求数组的最大值和最小值
  9. JavaScript专题之数组扁平化
  10. JavaScript专题之学underscore在数组中查找指定元素
  11. JavaScript专题之jQuery通用遍历方法each的实现
  12. JavaScript专题之如何判断两个对象相等
  13. JavaScript专题之函数柯里化
  14. JavaScript专题之偏函数
  15. JavaScript专题之惰性函数
  16. JavaScript专题之函数组合
  17. JavaScript专题之函数记忆
  18. JavaScript专题之递归
  19. JavaScript专题之乱序
  20. JavaScript专题之解读 v8 排序源码
  21. ASP.NET Core Web API专题之利用过滤器Filter和特性Attribute实现对返回结果的封装和统一异常处理
  22. ASP.NET Core Web API专题之 How do I allow a PUT, DELETE, MKCOL, COPY and MOVE request on Nginx server?

数据交互格式不正确导致无法解析出json

Dealing With Camel Casing In ASP.NET Core Web API

https://www.iaspnetcore.com/blog/blogpost/5953e09584cd45053069b2f9/dealing-with-camel-casing-in-aspnet-core-web-api

class 未写{set;get;}导致返回空数组数据

class 未写public 导致返回空数组数据

 

 

nginx 配置导致Error 405 – Methods not Allowed in ASP.NET Core PUT and DELETE requests

https://www.iaspnetcore.com/blog/blogpost/603ba42e3d0b4f01f84aae56/error-405-methods-not-allowed-in-aspnet-core-web-api-post-put-and-delete-requests

 

 

 

 



1.约定请求参数的传递格式

1.1 前台有几种参数的传递格式,前台和后台需进行约定

1.2 后台设置接受参数的格式,否则路由匹配不到会发生404错误。


2.约定返回内容的数据格式
json
xml
text

3.约定返回内容字段名称的格式
3.1 大小写转换

4.约定请求的合法性

cqrs

5.约定api的版本号

RestFul WebApi 数据交换说明  

(一)服务器端返回的数据格式要指定

        客户端和服务器端的数据交换格式需要某种约定 响应提要设置为返回json格式的数据

(二)字段信息大小写格式约定 驼峰命名法

(三)传输协议约定 messagepack

(四)加密格式约定     

  一、创建Web ApI

(一)配置端口号

x:\x\x.WebApi\Properties\launchSettings.json

"applicationUrl": "http://localhost:7001/"

(二)配置 控制台显示信息

x:\x.WebApi\appsettings.json

{

"Logging":

{

"IncludeScopes": false,

"Debug":

{

"LogLevel":

{

"Default": "Information"

}

},

"Console":

{

"LogLevel":

{

"Default": "Information"

}

}

}

}

(三)配置同源策略

1.在startup.cs 配置两种同源策略

public void ConfigureServices(IServiceCollection services)

{

services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>(); //配置跨域处理,添加 CORS 策略: services.AddCors(options => {

options.AddPolicy("any",

builder => {

builder.AllowAnyOrigin() //允许任何来源的主机访问 .AllowAnyMethod() .AllowAnyHeader(); // .AllowCredentials();//指定处理cookie }); options.AddPolicy("AllowSameDomain", builder => { builder.WithOrigins(

"http://www.iaspnetcore.com",

"https://q.iaspnetcore.com",

"https://zzk.iaspnetcore.com",

"https://job.iaspnetcore.com" )

.AllowAnyMethod()

.AllowAnyHeader();

// .AllowCredentials();

//指定处理cookie

});

});

2.在控制器中启用其中一种同源策略

namespace x.WebApi.v1.Controllers

{

///

/// 获取信息 ///

[Route("v1/[controller]")]

[EnableCors("any")]

public class GetStockInfoController : Controller

{

....

}

二、带版本号的Web Api

三、生成Web Api文档

四、Web Api 授权

五、web Api 优化

 符合REST设计风格的Web API称为RESTful API。它从以下三个方面资源进行定义:

直观简短的资源地址:URI,比如:http://example.com/resources/。

传输的资源:Web服务接受与返回的互联网媒体类型,比如:JSON,XML,YAML等。
对资源的操作:Web服务在该资源上所支持的一系列请求方法(比如:POST,GET,PUT或DELETE)。   
PUT和DELETE方法是幂等方法。GET方法是安全方法(不会对服务器端有修改,因此当然也是幂等的)。 
不像基于SOAP的Web服务,RESTful Web服务并没有“正式”的标准。这是因为REST是一种架构,而SOAP只是一个协议。
虽然REST不是一个标准,但大部分RESTful Web服务实现会使用HTTP、URI、JSON和XML等各种标准。 .

第一章 项目结构设计

1.1.1.1 ASP.NET Core Web API Actual combat series(2)-ASP.NET Core Web API Project Structure

 

 

第二章 客户端和RestFul WebApi 服务器的数据交换说明  

2.1.约定客户端请求参数的传递格式

2.1.1 前台有几种参数的传递格式,前台和后台需进行约定

2.1.2 后台设置接受参数的格式,否则路由匹配不到会发生404错误。

 

2.2.服务器端返回的数据格式要指定

客户端和服务器端的数据交换格式需要某种约定 响应提要设置为返回json格式的数据

json

xml

text

post请求有3种方式,由请求头中的content-type决定,属于哪一种post请求

application/x-www-form-urlencoded: 普通http请求方式,参数是普通的url参数拼接
application/json: JSON请求方式,参数是json格式
multipart/form-data: 文件上传

2.3.字段信息大小写格式约定 驼峰命名法

2.3.1 大小写转换

2.4 传输协议约定 messagepack

 

2.5 加密格式约定 

 

2.6.约定统一返回的数据格式

 

4.1微信数据的返回格式

参考:https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-http-api/database/databaseCollectionGet.html的返回格式

4.1.1 单个数据对象的返回格式

{
    "errcode": 0,
    "errmsg": "ok",
    "matched": 1,
    "modified": 1,
    "id": ""
}
4.1.2 数据列表的返回格式
{
  "errcode": 0,
  "errmsg": "ok",
  "collections": [
      {
          "name": "geo",
          "count": 13,
          "size": 2469,
          "index_count": 1,
          "index_size": 36864
      },
      {
          "name": "test_collection",
          "count": 1,
          "size": 67,
          "index_count": 1,
          "index_size": 16384
      }
  ],
  "pager": {
      "Offset": 0,
      "Limit": 10,
      "Total": 2
  }
}

4.2  Aspose.Cloud数据的返回格式

4.2.1 

AsposeCloudApi/src/Aspose.Cloud.Models/Common/ApiResponse.cs

using System;
using System.Collections.Generic;
using System.Text;

using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;

namespace Aspose.Cloud.Models.Common
{
    public class ApiResponse
    {
        public int StatusCode { get; }

        [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
        public string Message { get; }

        public ApiResponse(int statusCode, string message = null)
        {
            StatusCode = statusCode;
            Message = message ?? GetDefaultMessageForStatusCode(statusCode);
        }

        private static string GetDefaultMessageForStatusCode(int statusCode)
        {
            switch (statusCode)
            {
           
            case 404:
                return "Resource not found";
            case 500:
                return "An unhandled error occurred";
            default:
                return null;
        }
    }
}
}

4.2.2

using System;
using System.Collections.Generic;
using System.Text;

namespace Aspose.Cloud.Models.Common
{
    public class ApiOkResponse : ApiResponse
    {
        public int Total { get; set; }
        public object ExtraData { get; set; }
        public object Result { get; }



        public ApiOkResponse(object result)
            : base(200)
        {
            Result = result;
        }
    }
}

4.2.3 call

//对result 赋值
            ApiOkResponse apiOkResponse = new ApiOkResponse(model);
            //result 记录数
            apiOkResponse.Total = model.Articles.Count;

            return Ok(apiOkResponse);

4.3 custom

using System;
using System.Collections.Generic;
using System.Text;

namespace Stockso.Models
{
    public class ApiResponse<T>
    {
        public ApiResponse()
        {
            Items = new List<T>();
           
        }

        private int  status;  // 业务自定义状态码
        private String error;

        public int TotalCount { set; get; }  //总共多少数据
        public int TotalPage { set; get; }  //总共多少页
        public int CurrentPage { set; get; }  //当前是第几页
        public int PageSize { set; get; }  //每页多少数据



        public IList<T> Items { get; set; }

        public string ExtraData { get; set; }

        public string ErrorMessage { get; set; } //错误信息



    }
}

4.3.2 call

/// <summary>
        /// 盘口查询服务-多菜单
        /// </summary>
        public virtual Task<ApiResponse<SearchResultStockModel>> GetStockInfo(StockReportSearchModel model)
        {

#if DEBUG
            _logger.LogInformation($"Executed StockDataPhysicalDiskReportSearchService action {model.DayNum.ToString()}天数-{model.SelectedMenuId.ToString()}菜单项目");
#endif

            //准备存储信息
            List<SearchResultStockModel> searchResultStockModelList = new List<SearchResultStockModel>();

            switch (model.SelectedMenuId)
            {

                case (int)PanKouDataMenu.ktypeBigSell:
                    #region 大单压盘
                    {
                        //PRPDataProvider pRPDataProvider = new PRPDataProvider();
                        //Stockso.DataAnalysis.PanKou.SelectBigSellReport selectBigSellReport = new DataAnalysis.PanKou.SelectBigSellReport();

                        searchResultStockModelList= this._reportService.ReportTailLargeVolume(model.SelectedMenuId).Result;
                    }

                    break;
                    #endregion
            }

            PRPDataProvider pRPDataProvider = new PRPDataProvider();           
            pRPDataProvider.Close();

            Stockso.Models.ApiResponse<SearchResultStockModel> searchResult = new Stockso.Models.ApiResponse<SearchResultStockModel>();
            searchResult.Items = searchResultStockModelList;
            searchResult.ExtraData = "";

            return Task.FromResult(searchResult);     

        }

5.约定api的版本号

 

 

第三章 Web Api 授权

4.约定请求的合法性

cqrs

  

  一、创建Web ApI

(一)配置端口号

x:\x\x.WebApi\Properties\launchSettings.json

"applicationUrl": "http://localhost:7001/"

(二)配置 控制台显示信息

x:\x.WebApi\appsettings.json

{
  //"Logging": {
  //  "LogLevel": {
  //    "Default": "Debug",
  //    "Microsoft": "Warning",
  //    "Microsoft.Hosting.Lifetime": "Information"
  //  }
  //},
  "Logging": {
    "IncludeScopes": false,
    "Debug": {
      "LogLevel": {
        "Default": "Information"
      }
    },

    "Console": {
      "LogLevel": {
        "Default": "Information"
      }
    }
  },

  "AllowedHosts": "*"
}

(三)配置同源策略

1.在startup.cs 配置两种同源策略

public void ConfigureServices(IServiceCollection services)

{

services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>(); //配置跨域处理,添加 CORS 策略: services.AddCors(options => {

options.AddPolicy("any",

builder => {

builder.AllowAnyOrigin() //允许任何来源的主机访问 .AllowAnyMethod() .AllowAnyHeader(); // .AllowCredentials();//指定处理cookie }); options.AddPolicy("AllowSameDomain", builder => { builder.WithOrigins(

"http://www.iaspnetcore.com",

"https://q.iaspnetcore.com",

"https://zzk.iaspnetcore.com",

"https://job.iaspnetcore.com" )

.AllowAnyMethod()

.AllowAnyHeader();

// .AllowCredentials();

//指定处理cookie

});

});

2.在控制器中启用其中一种同源策略

namespace x.WebApi.v1.Controllers

{

///

/// 获取信息 ///

[Route("v1/[controller]")]

[EnableCors("any")]

public class GetStockInfoController : Controller

{

....

}

二、带版本号的Web Api

三、生成Web Api文档

四、Web Api 授权

五、web Api 优化

使用 aspnet.mvc.core     符合REST设计风格的Web API称为RESTful API。它从以下三个方面资源进行定义:

直观简短的资源地址:URI,比如:http://example.com/resources/。

传输的资源:Web服务接受与返回的互联网媒体类型,比如:JSON,XML,YAML等。对资源的操作:Web服务在该资源上所支持的一系列请求方法(比如:POST,GET,PUT或DELETE)。   PUT和DELETE方法是幂等方法。GET方法是安全方法(不会对服务器端有修改,因此当然也是幂等的)。 不像基于SOAP的Web服务,RESTful Web服务并没有“正式”的标准。这是因为REST是一种架构,而SOAP只是一个协议。虽然REST不是一个标准,但大部分RESTful Web服务实现会使用HTTP、URI、JSON和XML等各种标准。 .

 

blazor+web api

1.定义控制器路由

  /// </summary>
    [Route("v1/[controller]")]
    [ApiController]
   // [EnableCors("any")]
    public class GetStockCwDataController : BaseAPIController
    {

2.定义控制中方法路由

 /// <returns></returns>
        [HttpGet("GetCwDataInfo")]
        public IEnumerable<BaseData> Get()
        {

3.客户端调用

v1/控制器名称/方法路由名称

@code {
    Stockso.Core.Domain.Stocks.BaseData[] forecasts;

    protected override async Task OnInitializedAsync()
    {
        forecasts = await Http.GetJsonAsync<Stockso.Core.Domain.Stocks.BaseData[]>(GlobalHelper.BaseUrl + "/v1/GetStockCwData/GetCwDataInfo");

 

Api接口格式规范

1.API 的 URL

按照资源的逻辑层级,对 URL 进行嵌套,比如一个用户属于某个团队,而这个团队也是众多团队之一;那么获取这个用户的接口可能是这样:

GET /api/teams/123/members/234 表示获取 id 为 123 的小组下,id 为234 的成员信息
/api/teams (对应团队列表)
/api/teams/123 (对应 ID 为 123 的团队)
/api/teams/123/members (对应 ID 为 123 的团队下的成员列表)
/api/teams/123/members/456 (对应 ID 为 123 的团队下 ID 未 456 的成员)

https://cloud.tencent.com/developer/article/1407807?from=article.detail.1464720