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)); }
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(); }