You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 11:01:25