[C#/COMMON/.NET5] IAsyncEnumerable<T> 인터페이스 : 넥서스 저장소(Nexus Repository)에서 자산(Asset) 정보 구하기
C#/Common 2021. 8. 15. 00:41728x90
반응형
728x170
▶ Checksum.cs
using Newtonsoft.Json;
namespace TestProject
{
/// <summary>
/// 체크썸
/// </summary>
public class Checksum
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Property
////////////////////////////////////////////////////////////////////////////////////////// Public
#region MD5 - MD5
/// <summary>
/// MD5
/// </summary>
[JsonProperty("md5")]
public string MD5 { get; set; }
#endregion
#region SHA1 - SHA1
/// <summary>
/// SHA1
/// </summary>
[JsonProperty("sha1")]
public string SHA1 { get; set; }
#endregion
#region SHA256 - SHA256
/// <summary>
/// SHA256
/// </summary>
[JsonProperty("sha256")]
public string SHA256 { get; set; }
#endregion
#region SHA512 - SHA512
/// <summary>
/// SHA512
/// </summary>
[JsonProperty("sha512")]
public string SHA512 { get; set; }
#endregion
}
}
728x90
▶ Item.cs
using Newtonsoft.Json;
namespace TestProject
{
/// <summary>
/// 항목
/// </summary>
public class Item
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Property
////////////////////////////////////////////////////////////////////////////////////////// Public
#region ID - ID
/// <summary>
/// ID
/// </summary>
[JsonProperty("id")]
public string ID { get; set; }
#endregion
#region 저장소 - Repository
/// <summary>
/// 저장소
/// </summary>
[JsonProperty("repository")]
public string Repository { get; set; }
#endregion
#region 경로 - Path
/// <summary>
/// 경로
/// </summary>
[JsonProperty("path")]
public string Path { get; set; }
#endregion
#region 포맷 - Format
/// <summary>
/// 포맷
/// </summary>
[JsonProperty("format")]
public string Format { get; set; }
#endregion
#region 다운로드 URL - DownloadURL
/// <summary>
/// 다운로드 URL
/// </summary>
[JsonProperty("downloadUrl")]
public string DownloadURL { get; set; }
#endregion
#region 체크썸 - Checksum
/// <summary>
/// 체크썸
/// </summary>
[JsonProperty("checksum")]
public Checksum Checksum { get; set; }
#endregion
}
}
300x250
▶ AssetData.cs
using System.Collections.Generic;
using Newtonsoft.Json;
namespace TestProject
{
/// <summary>
/// 자산 데이터
/// </summary>
public class AssetData
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Property
////////////////////////////////////////////////////////////////////////////////////////// Public
#region 항목 리스트 - ItemList
/// <summary>
/// 항목 리스트
/// </summary>
[JsonProperty("items")]
public IList<Item> ItemList { get; set; }
#endregion
#region 연속 토큰 - ContinuationToken
/// <summary>
/// 연속 토큰
/// </summary>
[JsonProperty("continuationToken")]
public string ContinuationToken { get; set; }
#endregion
}
}
▶ NexusHelper.cs
using System.Collections.Generic;
using System.Net;
using System.Net.Http;
using Newtonsoft.Json;
namespace TestProject
{
/// <summary>
/// 넥서스 헬퍼
/// </summary>
public static class NexusHelper
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Field
////////////////////////////////////////////////////////////////////////////////////////// Private
#region Field
/// <summary>
/// 항목 리스트 구하기 URL 포맷 1
/// </summary>
private const string GET_ITEM_LIST_URL_FORMAT1 = "http://nexus.arca.net/service/rest/v1/assets?repository={0}";
/// <summary>
/// 항목 리스트 구하기 URL 포맷 2
/// </summary>
private const string GET_ITEM_LIST_URL_FORMAT2 = "http://nexus.arca.net/service/rest/v1/assets?repository={0}&continuationToken={1}";
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Property
////////////////////////////////////////////////////////////////////////////////////////// Static
//////////////////////////////////////////////////////////////////////////////// Public
#region 사용자 ID - UserID
/// <summary>
/// 사용자 ID
/// </summary>
public static string UserID { get; set; }
#endregion
#region 패스워드 - Password
/// <summary>
/// 패스워드
/// </summary>
public static string Password { get; set; }
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Method
////////////////////////////////////////////////////////////////////////////////////////// Static
//////////////////////////////////////////////////////////////////////////////// Public
#region 항목 리스트 구하기 (비동기) - GetItemListAsync(repositoryName)
/// <summary>
/// 항목 리스트 구하기 (비동기)
/// </summary>
/// <param name="repositoryName">저장소명</param>
/// <returns>항목 비동기 열거 가능형</returns>
public async static IAsyncEnumerable<Item> GetItemListAsync(string repositoryName)
{
NetworkCredential credential = new NetworkCredential(UserID, Password);
using(HttpClientHandler handler = new HttpClientHandler { Credentials = credential })
{
using(HttpClient client = new HttpClient(handler))
{
List<Item> list = new List<Item>();
string url = string.Format(GET_ITEM_LIST_URL_FORMAT1, repositoryName);
while(true)
{
string json = await client.GetStringAsync(url);
AssetData data = JsonConvert.DeserializeObject<AssetData>(json);
foreach(Item item in data.ItemList)
{
yield return item;
}
if(string.IsNullOrWhiteSpace(data.ContinuationToken))
{
break;
}
else
{
url = string.Format(GET_ITEM_LIST_URL_FORMAT2, repositoryName, data.ContinuationToken);
}
}
}
}
}
#endregion
}
}
▶ Program.cs
using System;
using System.Threading.Tasks;
namespace TestProject
{
/// <summary>
/// 프로그램
/// </summary>
class Program
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Method
////////////////////////////////////////////////////////////////////////////////////////// Static
//////////////////////////////////////////////////////////////////////////////// Private
#region 프로그램 시작하기 - Main()
/// <summary>
/// 프로그램 시작하기
/// </summary>
/// <returns>태스크</returns>
private async static Task Main()
{
NexusHelper.UserID = "admin";
NexusHelper.Password = "1234";
await foreach(Item item in NexusHelper.GetItemListAsync("arca-update"))
{
Console.WriteLine(item.DownloadURL);
}
}
#endregion
}
}
728x90
반응형
그리드형(광고전용)
'C# > Common' 카테고리의 다른 글
[C#/COMMON] 배열 추가하기 (0) | 2021.08.18 |
---|---|
[C#/COMMON/.NET5] IAsyncEnumerable<T> 인터페이스 : 비동기 스트림 취소하기 (0) | 2021.08.15 |
[C#/COMMON/.NET5] 누겟 설치 : System.Interactive.Async (0) | 2021.08.15 |
[C#/COMMON/.NET5] HttpClient 클래스 : DefaultRequestHeaders 속성을 사용해 사용자 ID/패스워드 설정하기 (0) | 2021.08.15 |
[C#/COMMON/.NET5] HttpClient 클래스 : HttpClientHandler 객체를 사용해 사용자 ID/패스워드 설정하기 (0) | 2021.08.15 |
[C#/COMMON] WebClient 클래스 : 넥서스 저장소(Nexus Repository)에서 파일 업로드/삭제/목록 구하기 (0) | 2021.08.12 |
[C#/COMMON] SmtpClient 클래스 : Send 메소드를 사용해 메일 보내기 (0) | 2021.08.11 |
[C#/COMMON] MailMessage 클래스 : Attachments 속성을 사용해 첨부 파일 추가하기 (0) | 2021.08.11 |
[C#/COMMON] ServicePointManager 클래스 : WebClient/HttpClient 객체에서 SSL/TLS 보안 채널 사용하기 (0) | 2021.08.11 |
[C#/COMMON] Process 클래스 : Start 정적 메소드를 사용해 메일 프로그램을 실행하고 새 메일 작성하기 (0) | 2021.08.07 |
댓글을 달아 주세요