Hi
我需要帮助,我必须上课,这个班得到的黄金价格使用API NBP。
const string uriBase = "http://api.nbp.pl/api/cenyzlota/";
public double get_price(DateTime date)
{
// wpisanie daty w formacie YYYY-MM-DD z console.ReadLine()
string baseDate = @"^([0-9]{4})-([0-9]{2})-([0-9]{2})$";
Console.WriteLine("Podaj datę w formacie YYYY-MM-DD:");
string dateStr = Console.ReadLine();
if (Regex.IsMatch(dateStr, baseDate))
{
Console.WriteLine("Data poprawna");
}
else
{
Console.WriteLine("Data niepoprawna");
}
// wysłanie zapytania do API po odpowiedź
string uriQuery = uriBase + dateStr;
// zwracanie ceny złota z podanego z konsoli dnia
WebRequest request = HttpWebRequest.Create(uriQuery);
HttpWebResponse response = (HttpWebResponse)request.GetResponseAsync().Result;
string json = new StreamReader(response.GetResponseStream()).ReadToEnd();
string[] jsonSplit = json.Split(new string[] { "cena" }, StringSplitOptions.None);
string[] jsonSplit2 = jsonSplit[1].Split(new string[] { "data" }, StringSplitOptions.None);
//usunięcie nawiasów i znaków specjalnych z ceny złota
string jsonSplit3 = jsonSplit2[0].Replace(":", "");
string jsonSplit4 = jsonSplit3.Replace(""", "");
string jsonSplit5 = jsonSplit4.Replace(" ", "");
string jsonSplit6 = jsonSplit5.Replace(",", "");
string jsonSplit7 = jsonSplit6.Replace("}", "");
string jsonSplit8 = jsonSplit7.Replace("]", "");
string jsonSplit9 = jsonSplit8.Replace("[", "");
// podanie ceny złota z podanego dnia po usunięci z niej znaków specjalnych
string price = jsonSplit9;
Console.WriteLine("Cena złota z dnia " + dateStr + " wynosi: " + price + " zł");
Console.WriteLine("Zostnie zapisane do pliku");
Console.ReadLine();
//zapisanie wyniku do pliku w nowej linii
string path = @"C:UserstmyszDesktopjson.txt";
File.AppendAllText(path, dateStr + " " + price + Environment.NewLine);
//sprawdzenie czy plik istnieje
if (File.Exists(path))
{
Console.WriteLine("Plik istnieje");
}
else
{
Console.WriteLine("Plik nie istnieje");
}
//sprawdzenie czy wpis w pliku jest pusty
if (File.ReadAllText(path) == "")
{
Console.WriteLine("Plik jest pusty");
}
else
{
Console.WriteLine("Plik nie jest pusty");
}
return 0;
}
我还有另一个班";"代理";,类Proxy是助手设计模式的一个实现。代理发送到API的日期问题,如果您发送相同的日期秒时间,代理不发送问题到API。我是这样实现的:
internal class GoldServiceProxy : GoldService
{
private readonly GoldService goldService;
private readonly Dictionary<DateTime, double> cache = new Dictionary<DateTime, double>();
public GoldServiceProxy(GoldService goldService)
{
this.goldService = goldService;
}
public double get_price(DateTime date)
{
if (cache.ContainsKey(date))
{
return cache[date];
}
else
{
double price = goldService.get_price(date);
cache.Add(date, price);
return price;
}
}
}
使用
static void Main(string[] args)
for (int i = 0; i < 10; i++)
{
try
{
GoldServiceProxy goldServiceProxy = new GoldServiceProxy(new GoldService());
var price = goldServiceProxy.get_price(DateTime.Now);
Console.WriteLine(price);
}
catch
{
Console.ForegroundColor = ConsoleColor.Yellow;
Console.WriteLine("Data nie została zanleziona");
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("Wciśnij dowolny klawisz aby zakończyć");
Console.ReadKey();
}
}
代理不起作用,谁来帮我?我认为这个代码中有一个错误
public double get_price(DateTime date)
{
if (cache.ContainsKey(date))
{
return cache[date];
}
else
{
double price = goldService.get_price(date);
cache.Add(date, price);
return price;
}
}
因为当您使用DateTime
时,在字典缓存中添加了具有不同时间的相同日期,所以即使您再次写入此日期,代理也会将问题发送到API。
它看起来是这样的:
[0]: {[{2022-11-07 6:12:30 AM}, {258.25}]}
[1]: {[{2022-11-07 6:20:10 AM}, {258.25}]}
[2]: {[{2022-11-07 6:52:17 AM}, {258.25}]}
检查该解决方案:仅使用"日期"提取字典条目并且必须将缓存声明为静态