siteserver / cms

SS CMS 基于 .NET Core,能够以最低的成本、最少的人力投入在最短的时间内架设一个功能齐全、性能优异、规模庞大并易于维护的网站平台。
https://sscms.com
GNU Affero General Public License v3.0
3.66k stars 1.21k forks source link

STL REST API 空引用问题 #2784

Closed wxjv99 closed 3 years ago

wxjv99 commented 3 years ago

问题描述:

在使用STL REST API时无论参数是否正确(无API KEY时表现正常,返回401),均出现空引用错误。 postman测试空引用

问题点:

  1. 如图 QQ图片20201125104143
  2. _parseManager中的contextInfo和PageInfo均未初始化 QQ图片20201125104321

我的解决方案

  1. 位置 SSCMS.Web.Controllers.V1.StlController 第39行,重写GetRequest 类

        public class GetRequest : Dictionary<string, string>
        {
            public int SiteId { get; set; }
    
            public string SiteDir { get; set; }
    
            public int ChannelId { get; set; }
    
            public int ContentId { get; set; }
    
            public void InitialParameters()
            {
                SiteId = InitialIntValue(nameof(SiteId));
                SiteDir = InitialStringValue(nameof(SiteDir));
                ChannelId = InitialIntValue(nameof(ChannelId));
                ContentId = InitialIntValue(nameof(ContentId));
            }
    
            private string ToCamelName(string name) => name[0..1].ToLower() + name[1..];
    
            private int InitialIntValue(string key) => Convert.ToInt32(InitialStringValue(key));
    
            private string InitialStringValue(string key)
            {
                if (string.IsNullOrEmpty(key)) return null;
                if (Remove(key, out string value))
                {
                    Remove(ToCamelName(key));
                }
                else
                {
                    Remove(ToCamelName(key), out value);
                }
                return value;
            }
        }
  2. 位置 SSCMS.Web.Controllers.V1.StlController.Get 第30行 添加对GetRequest属性的初始化及对_parseManeger属性的赋值

           if (!await _accessTokenRepository.IsScopeAsync(_authManager.ApiToken, Constants.ScopeStl))
            {
                return Unauthorized();
            }
    
            //以下一行为修改内容,对GetRequest属性的初始化
            request.InitialParameters();
    
            var stlRequest = new StlRequest();
            await stlRequest.LoadAsync(_authManager, _pathManager, _configRepository, _siteRepository, request);
    
            var site = stlRequest.Site;
    
            if (site == null)
            {
                return NotFound();
            }
    
            //以下两行为修改内容,添加对_parseManeger属性的赋值
            _parseManager.ContextInfo = stlRequest.ContextInfo;
            _parseManager.PageInfo = stlRequest.PageInfo;
    
            elementName = $"stl:{StringUtils.ToLower(elementName)}";
cuikangjiejava commented 3 years ago

linux版本还是.net版本?

wxjv99 commented 3 years ago

linux版本还是.net版本?

Dot Net Core

cuikangjiejava commented 3 years ago

我遇到这样的问题: 请求:/api/v1/stl/sites?apikey=fa9e1771-bea3-46c8-8aa1-830004b6d387 返回:Object reference not set to an instance of an object.

wxjv99 commented 3 years ago

我遇到这样的问题: 请求:/api/v1/stl/sites?apikey=fa9e1771-bea3-46c8-8aa1-830004b6d387 返回:Object reference not set to an instance of an object.

这就是由于上面的问题导致的,按照上面的方法自己修改编译下就好了。