如何在C#中遍历分页的Moralis API获取全部NFT?
解决Moralis API分页获取全部NFT的C#实现
要获取钱包下的全部NFT,你需要利用API返回的cursor参数实现分页循环请求,直到获取完所有数据。以下是完整的实现方案:
1. 定义JSON反序列化模型类
首先创建对应API返回结构的模型类,方便处理返回数据:
using System.Collections.Generic; public class NftResponse { public int total { get; set; } public int page { get; set; } public int page_size { get; set; } public string cursor { get; set; } public List<NftItem> result { get; set; } } public class NftItem { public string token_address { get; set; } public string token_id { get; set; } public string amount { get; set; } public string owner_of { get; set; } public string token_hash { get; set; } public string block_number_minted { get; set; } public string block_number { get; set; } public string contract_type { get; set; } public string name { get; set; } public string symbol { get; set; } public string token_uri { get; set; } public string metadata { get; set; } public string last_token_uri_sync { get; set; } public string last_metadata_sync { get; set; } public string minter_address { get; set; } }
2. 分页获取全部NFT的核心代码
复用HttpClient进行循环请求,每次将上一次返回的cursor作为参数传入,直到cursor为空:
using System; using System.Collections.Generic; using System.Net.Http; using System.Net.Http.Headers; using System.Text.Json; using System.Threading.Tasks; public class NftFetcher { private readonly HttpClient _httpClient; private readonly string _apiKey; private readonly string _walletAddress; public NftFetcher(string apiKey, string walletAddress) { _apiKey = apiKey; _walletAddress = walletAddress; _httpClient = new HttpClient(); _httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); _httpClient.DefaultRequestHeaders.Add("X-API-Key", _apiKey); } public async Task<List<NftItem>> GetAllNftsAsync() { var allNfts = new List<NftItem>(); string currentCursor = null; do { var requestUrl = BuildRequestUrl(currentCursor); var request = new HttpRequestMessage(HttpMethod.Get, requestUrl); using (var response = await _httpClient.SendAsync(request)) { response.EnsureSuccessStatusCode(); var responseBody = await response.Content.ReadAsStringAsync(); var nftResponse = JsonSerializer.Deserialize<NftResponse>(responseBody); if (nftResponse?.result != null) { allNfts.AddRange(nftResponse.result); } currentCursor = nftResponse?.cursor; } // 可选:添加请求间隔,避免触发API频率限制 await Task.Delay(1000); } while (!string.IsNullOrEmpty(currentCursor)); return allNfts; } private string BuildRequestUrl(string cursor) { var baseUrl = $"https://deep-index.moralis.io/api/v2/{_walletAddress}/nft?chain=eth&format=decimal&normalizeMetadata=false"; if (!string.IsNullOrEmpty(cursor)) { baseUrl += $"&cursor={Uri.EscapeDataString(cursor)}"; } return baseUrl; } } // 使用示例 public class Program { public static async Task Main() { var apiKey = "your-api-key-here"; var walletAddress = "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045"; var fetcher = new NftFetcher(apiKey, walletAddress); var allNfts = await fetcher.GetAllNftsAsync(); Console.WriteLine($"Total NFTs fetched: {allNfts.Count}"); // 处理获取到的NFT数据 } }
关键说明
- HttpClient复用:避免每次请求新建
HttpClient,提升性能并避免端口耗尽问题 - Cursor处理:每次请求后更新
currentCursor,当cursor为空时停止循环,说明已获取全部数据 - URL编码:使用
Uri.EscapeDataString对cursor进行编码,避免特殊字符导致请求错误 - 请求间隔:添加
Task.Delay避免触发API的频率限制,可根据Moralis的配额调整间隔时间 - 异常处理:可根据需求添加
try-catch块处理网络异常、API错误等情况
内容的提问来源于stack exchange,提问作者C. Oezer
相关产品推荐
相关产品推荐

