【发布时间】:2019-08-16 21:13:33
【问题描述】:
下面是一个执行 API 调用的脚本,它检索一些 ReportID(从数据库表中),将它们传递给一个单独运行它们的方法,最后查看每个是否包含字段 Name_First。
我需要帮助的是创建一个计数,它会告诉我有多少报告包含字段 Name_First,有多少不包含字段,以及在所有报告中包含字段 Name_First 的百分比是多少。
目前,该脚本会查询两个 ReportID (12300,12301) 进行测试。一份报告中包含字段 Name_First,而另一份则没有。从我编写的 foreach 循环中,我的目标是计算每次有空值和每次没有空值时,得到一个总数,然后将非空值除以两者的总和。但是,当我运行此脚本时,控制台位于
Console.WriteLine(total);
Console.WriteLine(total_noFirstName);
Console.WriteLine(total_FirstName);
返回值 0、0 和 0。我认为我在这里遇到了范围问题,但我不太确定。如果我能得到一些帮助来解决这个问题,我将非常感激。
谢谢!
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
namespace NameFirstSearch
{
class Program
{
static void Main(string[] args)
{
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;
const string username = "Username";
const string password = "Password";
const string baseUrl = "https://test.com/rest/services/";
const string queryString = "query?q=Select * From Report Where ReportID in (12300,12301)";
const string queryNameFirst = "getreport/";
var client = new HttpClient();
client.BaseAddress = new Uri(baseUrl);
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
var auth = Convert.ToBase64String(Encoding.Default.GetBytes(username + ":" + password));
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", auth);
//GetReports(client, queryString).Wait();
var reportsList = GetReports(client, queryString).Result;
GetNameFirst(client, queryNameFirst, reportsList).Wait();
Console.ReadLine();
}
static async Task<List<Properties>> GetReports(HttpClient client, string queryString)
{
List<Properties> result = new List<Properties>();
var response = await client.GetAsync(queryString);
// Check for a successfull result
if (response.IsSuccessStatusCode)
{
var json = await response.Content.ReadAsStringAsync();
result = JsonConvert.DeserializeObject<List<Properties>>(json);
}
else
{
// Error code returned
Console.WriteLine("No records found on first method.");
}
return result;
}
static async Task GetNameFirst(HttpClient client, string queryNameFirst, List<Properties> results)
{
string reportType = ".json";
foreach (var item in results)
{
var output = await client.GetAsync(queryNameFirst + item.ReportID + reportType);
if (output.IsSuccessStatusCode)
{
var allText = await output.Content.ReadAsStringAsync();
var fields = JsonConvert.DeserializeObject<List<FirstName>>(allText);
var test = JsonConvert.SerializeObject(fields);
Console.WriteLine(test);
int total_FirstName = 0;
int total_noFirstName = 0;
int total = total_FirstName + total_noFirstName;
foreach (var split in fields)
{
if (split.Name_First != null)
{
total_FirstName++;
}
else if (split.Name_First == null)
{
total_noFirstName++;
}
}
Console.WriteLine(total);
Console.WriteLine(total_noFirstName);
Console.WriteLine(total_FirstName);
}
else
{
// Error code returned
Console.WriteLine("No records found on second method.");
}
}
}
}
}
类属性
int ReportID {get; set;}
类名
string Name_First {get; set;}
Console.WriteLine(test) 处的结果;
[{"Name_First":"Mario"}]
[{"Name_First":null}]
Console.WriteLine(allText);的结果
[{"Name_First":"Mario","Entry_ID":"72313"}]
[{"Name_Last":"Rincon Recio","Entry_ID":"72313"}]
【问题讨论】:
-
这是一个一流的 SQL 漏洞。它几乎不能称为 SQL“注入”,因为无需使用任何注入技巧就可以提供完整的有害查询。
-
好吧,
total总是为零,因为您将其设置为0+0 -
我相信像这样新建一个 HttpClient 并不是最佳实践。请参阅Microsoft docs 了解他们的建议。
-
我建议使用 Linq 而不是编写自己的代码。它有一个计数方法可以满足您的需求。-docs.microsoft.com/en-us/dotnet/api/…
-
好的,我现在明白了。
results中的每个列表都只有一项。您应该在开始时在结果循环之外声明和初始化total_FirstName和total_noFirstName。每次通过循环时,您都将它们设置为零。同样,在底部的循环外声明total并求和,然后打印出值。
标签: c# visual-studio