如何使用 c# 使用 httpwebrequest 从 json api 获取数据?

Posted

技术标签:

【中文标题】如何使用 c# 使用 httpwebrequest 从 json api 获取数据?【英文标题】:How to get data from json api with c# using httpwebrequest? 【发布时间】:2017-11-30 05:36:37 【问题描述】:

我想在我的 c# 控制台应用程序中从 https://api.coinmarketcap.com/v1/ticker/ 获取所有变量。 我该怎么做?

我首先将整个页面作为一个流。现在该怎么办?

private static void start_get()

    HttpWebRequest WebReq = (HttpWebRequest)WebRequest.Create
        (string.Format("https://api.coinmarketcap.com/v1/ticker/"));

    WebReq.Method = "GET";

    HttpWebResponse WebResp = (HttpWebResponse)WebReq.GetResponse();

    Console.WriteLine(WebResp.StatusCode);
    Console.WriteLine(WebResp.Server);

    Stream Answer = WebResp.GetResponseStream();
    StreamReader _Answer = new StreamReader(Answer);
    Console.WriteLine(_Answer.ReadToEnd());

【问题讨论】:

你想要什么,一个包含信息的字符串或那个 json 结果的对象表示? 签出:***.com/questions/8270464/… 有几个答案可以帮助您启动和运行 Best way to call a JSON WebService from a .NET Console的可能重复 【参考方案1】:

首先你需要一个自定义类用于反序列化:

public class Item

    public string id  get; set; 
    public string name  get; set; 
    public string symbol  get; set; 
    public string rank  get; set; 
    public string price_usd  get; set; 
    [JsonProperty(PropertyName = "24h_volume_usd")]   //since in c# variable names cannot begin with a number, you will need to use an alternate name to deserialize
    public string volume_usd_24h  get; set; 
    public string market_cap_usd  get; set; 
    public string available_supply  get; set; 
    public string total_supply  get; set; 
    public string percent_change_1h  get; set; 
    public string percent_change_24h  get; set; 
    public string percent_change_7d  get; set; 
    public string last_updated  get; set; 

接下来,您可以使用Newtonsoft Json,一个免费的JSON序列化和反序列化框架,通过以下方式获取您的项目(包括以下using语句):

using System.Net;
using System.IO;
using Newtonsoft.Json;

private static void start_get()

    HttpWebRequest WebReq = (HttpWebRequest)WebRequest.Create(string.Format("https://api.coinmarketcap.com/v1/ticker/"));

    WebReq.Method = "GET";

    HttpWebResponse WebResp = (HttpWebResponse)WebReq.GetResponse();

    Console.WriteLine(WebResp.StatusCode);
    Console.WriteLine(WebResp.Server);

    string jsonString;
    using (Stream stream = WebResp.GetResponseStream())   //modified from your code since the using statement disposes the stream automatically when done
    
       StreamReader reader = new StreamReader(stream, System.Text.Encoding.UTF8);
       jsonString = reader.ReadToEnd();
    

    List<Item> items = JsonConvert.DeserializeObject<List<Item>>(jsonString);

    Console.WriteLine(items.Count);     //returns 921, the number of items on that page

最后,元素列表存储在items 中。

【讨论】:

【参考方案2】:

Keyur PATEL 作品的简化版。

static void GetCoinValues()

    string json = new WebClient().DownloadString("https://api.coinmarketcap.com/v1/ticker/");

    List<Item> items = JsonConvert.DeserializeObject<List<Item>>(json);

    foreach (var item in items)
    
        Console.WriteLine("ID: " + item.id.ToUpper());
        Console.WriteLine("Name: " + item.name.ToUpper());
        Console.WriteLine("Symbol: " + item.symbol.ToUpper());
        Console.WriteLine("Rank: " + item.rank.ToUpper());
        Console.WriteLine("Price (USD): " + item.price_usd.ToUpper());
        Console.WriteLine("\n");
    

【讨论】:

如何使用您的方法获取特定品种的数据?我在循环中添加了 IF (item.symbol = mySymbol) set some variables 但它没有返回任何内容。 没关系,我弄明白了……大小写匹配有问题,所以我不得不大写我的字符串。但是 json 请求似乎限制了列表。没有给出完整的货币清单。无论如何要解决这个问题? 我可以说服你分享你的 github repo 吗? 请注意 WebClient 实现 IDisposable 并且应该具有 Using 或以其他方式处置。

以上是关于如何使用 c# 使用 httpwebrequest 从 json api 获取数据?的主要内容,如果未能解决你的问题,请参考以下文章

Sentinel.01.Sentinel简介及简单使用

SpringCoudAlibaba之Sentinel上-使用篇

你知道如何使用阿里Sentinel实现接口限流吗?

7.Sentinel源码分析—Sentinel是怎么和控制台通信的?

如何使用Sentinel实现服务熔断和降级,看完你就懂了

如何使用 Jedis 库建立与 Redis Sentinel 的连接? [关闭]