示例#1
0
        public async Task <FileResponse> DownloadFileByUrlAsync(string url, DownloadFileMode mode = DownloadFileMode.GetStream)
        {
            var response = new FileResponse();
            var request  = new ApiRequest(url);

            request.DownloadFileMode = mode;
            return(await DownloadFileAsync(request));
        }
示例#2
0
        public void ParseModel(object model, string url = null, ApiRequestBuildOption option = null)
        {
            if (model == null)
            {
                return;
            }

            if (string.IsNullOrEmpty(url) == false)
            {
                this.ApiUrl = url;
            }
            else
            {
                var nm = model.GetType().Name;

                if (nm.EndsWith("Request"))
                {
                    nm = nm.Substring(0, nm.LastIndexOf("Request"));
                }
                this.ApiUrl = nm;
            }

            if (option?.SerializeObjectCallBack != null)
            {
                this.SerializeObjectCallBack = option?.SerializeObjectCallBack;
            }

            var type = model.GetType();
            var defaultLocationType = option?.DefaultLocationType ?? ApiSerializeLocationType.Ignore;

            if (defaultLocationType == ApiSerializeLocationType.NotSet || defaultLocationType == ApiSerializeLocationType.Auto)
            {
                defaultLocationType = ApiSerializeLocationType.Ignore;
            }

            defaultLocationType = GetSerializeLocationType(type, defaultLocationType);


            var defaultTextCaseType = option?.DefaultTextCaseType ?? ApiSerializeTextCaseType.None;

            if (defaultTextCaseType == ApiSerializeTextCaseType.NotSet)
            {
                defaultTextCaseType = ApiSerializeTextCaseType.None;
            }

            defaultTextCaseType = GetSerializeTextCaseType(type, defaultTextCaseType);

            var defaultEnumSerializeType = option?.DefaultEnumSerializeType ?? ApiEnumSerializeType.Value;

            if (defaultEnumSerializeType == ApiEnumSerializeType.NotSet)
            {
                defaultEnumSerializeType = ApiEnumSerializeType.Value;
            }

            defaultTextCaseType = GetSerializeTextCaseType(type, defaultTextCaseType);

            this.DownloadFileMode = option?.DefaultDownloadFileMode ?? DownloadFileMode.Get;
            if (DownloadFileMode == DownloadFileMode.NotSet)
            {
                DownloadFileMode = DownloadFileMode.Get;
            }

            StringWriter sw = new StringWriter(this.JsonBuilder);
            var          jw = new JsonTextWriter(sw);

            jw.WriteStartObject();
            var properties = type.GetProperties();

            foreach (var p in properties)
            {
                object[] attrs;

                attrs = p.GetCustomAttributes(typeof(ApiUrlAttribute), true);
                if (attrs != null && attrs.Count() > 0)
                {
                    var apiUrl = Convert.ToString(p.GetValue(model));
                    if (ApiUrl != null)
                    {
                        this.ApiUrl = apiUrl;
                    }

                    continue;
                }

                var locationType = GetSerializeLocationType(p, defaultLocationType);
                var textCaseType = GetSerializeTextCaseType(p, defaultTextCaseType);

                if (locationType == ApiSerializeLocationType.Ignore)
                {
                    continue;
                }

                var    value    = p.GetValue(model);
                string strValue = null;
                if (p.PropertyType.IsEnum)
                {
                    var serizeType = GetEnumSerializeType(p, defaultEnumSerializeType);
                    if (serizeType == ApiEnumSerializeType.Name)
                    {
                        strValue = Convert.ToString(value);
                    }
                    else
                    {
                        strValue = EnumHelper.Serialize(value);
                    }
                }

                var name = p.Name;
                if (textCaseType == ApiSerializeTextCaseType.CamelCase)
                {
                    name = name.ToCamelCase();
                }

                if (p.PropertyType.IsAssignableFrom(typeof(ISerializable)))
                {
                    var request = new ApiRequest();

                    request.ParseModel(value, this.ApiUrl, option);

                    this.ApiUrl = request.ApiUrl;

                    foreach (var key in request.QueryStrings.Keys)
                    {
                        this.QueryStrings[key] = request.QueryStrings[key];
                    }

                    foreach (var key in request.Headers.Keys)
                    {
                        this.Headers[key] = request.Headers[key];
                    }

                    var childJson = request.JsonBuilder.ToString();
                    if (string.IsNullOrEmpty(childJson) == false)
                    {
                        jw.WritePropertyName(name);
                        jw.WriteRawValue(childJson);
                    }

                    foreach (var d in request.Objects)
                    {
                        var obj = d as ISerializable;
                        if (obj != null)
                        {
                            this.AddObject(obj);
                        }
                    }

                    foreach (var file in request.Files)
                    {
                        this.AddFile(file.Name, file.FileName, file.Bytes);
                    }
                    return;
                }

                if (locationType == ApiSerializeLocationType.FromQuery)
                {
                    this.AddQueryParameter(name, strValue ?? Convert.ToString(value));
                }
                else if (locationType == ApiSerializeLocationType.FromHeader)
                {
                    this.AddHeaderParameter(name, strValue ?? Convert.ToString(value));
                }
                else // if (locationType == ApiSerializeLocationType.FromForm)
                {
                    attrs = p.GetCustomAttributes(typeof(ApiFileAttribute), true);
                    if (attrs != null && attrs.Count() > 0)
                    {
                        var attr = attrs[0] as ApiFileAttribute;
                        name = attr.Name;
                        var fileName = attr.FileName;
                        if (string.IsNullOrEmpty(attr.FileNameProperty) == false)
                        {
                            var fileNameProperty = type.GetProperty(attr.FileNameProperty);
                            var fileNameObj      = fileNameProperty.GetValue(model);
                            if (fileNameObj != null)
                            {
                                var str = Convert.ToString(fileNameObj);
                                name     = name ?? str;
                                fileName = fileName ?? str;
                            }
                        }
                        if (p.PropertyType.IsAssignableFrom(typeof(byte[])))
                        {
                            var bytes = value as byte[];
                            this.AddFile(name, fileName, bytes);
                        }
                        else if (p.PropertyType.IsAssignableFrom(typeof(Stream)))
                        {
                            var stream = value as Stream;
                            this.AddFile(name, fileName, stream);
                        }
                        else if (p.PropertyType.IsAssignableFrom(typeof(string)) || p.PropertyType.IsAssignableFrom(typeof(String)))
                        {
                            var filePath = value as string;
                            this.AddFile(name, fileName, filePath);
                        }
                    }
                    else
                    {
                        jw.WritePropertyName(name);
                        jw.WriteValue(value);
                    }
                }
            }

            jw.WriteEndObject();
        }