c# API GET请求分页记录时如何处理"The given header was not found"?
How to handle "The given header was not found" when paging records in c# API GET request?
我正在请求来自 API 的数据,该数据需要基于名为“cursor”的自定义 header 的分页记录。每次调用只能检索 100 条记录,因此我创建了一个 while 循环来执行。循环功能......直到它没有。一旦所有记录都被分页,headers 就会被丢弃,我的程序会出现“找不到给定的 header”的错误。没有插入到我的数据库中,因为请求是流式传输的,直到它们全部被分页。
我该如何处理才能使程序成功完成?
正在拨打的电话是:
var products = await ProcessProducts(userAndPasswordToken, BaseUrl);
正在调用的任务:
private static async Task<List<Products>> ProcessProducts(string userAndPasswordToken, string BaseUrl)
{
//Construct urls
string RequestPath = string.Format("food/products");
string FullUrl = string.Format("{0}{1}", BaseUrl, RequestPath);
string CursorPath = string.Format("");
//Use GetAsync instead of GetStreamAsync unless it's mandatory for your codebase.
var response = await client.GetAsync(FullUrl);
//Extract string from the response right away
var content = await response.Content.ReadAsStringAsync();
//Pass it in instead of Steam.
var Products = Newtonsoft.Json.JsonConvert.DeserializeObject<List<Products>>(content);
//Place the header key mapped with the cursor value.
IEnumerable<string> values = response.Headers.GetValues("cursor");
// string cursor = null;
string cursor = "4146";
// cursor = values?.FirstOrDefault();
do
{
CursorPath = $"?cursor={cursor}";
if (cursor == null) CursorPath = string.Format("");
FullUrl = string.Format("{0}{1}{2}", BaseUrl, RequestPath, CursorPath);
response = await client.GetAsync(FullUrl);
content = await response.Content.ReadAsStringAsync();
var nextProducts = Newtonsoft.Json.JsonConvert.DeserializeObject<List<Products>>(content);
// add Products in the next page.
Products.AddRange(nextProducts);
values = response.Headers.GetValues("cursor");
cursor = values?.FirstOrDefault();
System.Threading.Thread.Sleep(1000);
Console.WriteLine(FullUrl);
Console.WriteLine(response);
} while (cursor != null);
return Products;
}
此处使用 SQL 存储过程进行插入:
using (SqlConnection conn = new SqlConnection(lConnString))
{
conn.Open();
using (TransactionScope ts = new TransactionScope())
{
foreach (var repo in products)
{
SqlCommand cmdIns = new SqlCommand("usp_insert_Products", conn);
cmdIns.CommandType = CommandType.StoredProcedure;
cmdIns.Parameters.AddWithValue("@ProductId", repo.ProductId.ToString() ?? (object)DBNull.Value);
cmdIns.Parameters.AddWithValue("@ProductDetailId", repo.ProductDetailId.ToString() ?? (object)DBNull.Value);
cmdIns.ExecuteNonQuery();
}
ts.Complete();
}
conn.Close();
我提供的示例代码有一个完全不同的方法,如果我不能让我的代码正常运行,我正处于转向的风口浪尖:
示例代码
// Paging is handled by making a request and then making
// follow up requests as long as a "cursor" is returned.
string cursor = null;
do
{
var query = HttpUtility.ParseQueryString("");
query["locationId"] = "1";
query["businessDate"] = "2019-04-30";
if (cursor != null) query["cursor"] = cursor;
var fullUrl = $"{url}/{endpoint}?{query}";
_testOutputHelper.WriteLine(fullUrl);
var json = client.DownloadString(fullUrl);
results.AddRange(
JsonConvert.DeserializeObject<List<Check>>(json));
cursor = client.ResponseHeaders["cursor"];
} while (cursor != null);
}
如果找不到 header,您正在使用 response.Headers.GetValues("cursor")
即 documented 抛出 InvalidOperationException
。
您应该改用 TryGetValues
:
if (response.Headers.TryGetValues("cursor", out IEnumerable<string> values))
{
// header exists
}
else
{
// header doesn't exist
}
我正在请求来自 API 的数据,该数据需要基于名为“cursor”的自定义 header 的分页记录。每次调用只能检索 100 条记录,因此我创建了一个 while 循环来执行。循环功能......直到它没有。一旦所有记录都被分页,headers 就会被丢弃,我的程序会出现“找不到给定的 header”的错误。没有插入到我的数据库中,因为请求是流式传输的,直到它们全部被分页。
我该如何处理才能使程序成功完成?
正在拨打的电话是:
var products = await ProcessProducts(userAndPasswordToken, BaseUrl);
正在调用的任务:
private static async Task<List<Products>> ProcessProducts(string userAndPasswordToken, string BaseUrl)
{
//Construct urls
string RequestPath = string.Format("food/products");
string FullUrl = string.Format("{0}{1}", BaseUrl, RequestPath);
string CursorPath = string.Format("");
//Use GetAsync instead of GetStreamAsync unless it's mandatory for your codebase.
var response = await client.GetAsync(FullUrl);
//Extract string from the response right away
var content = await response.Content.ReadAsStringAsync();
//Pass it in instead of Steam.
var Products = Newtonsoft.Json.JsonConvert.DeserializeObject<List<Products>>(content);
//Place the header key mapped with the cursor value.
IEnumerable<string> values = response.Headers.GetValues("cursor");
// string cursor = null;
string cursor = "4146";
// cursor = values?.FirstOrDefault();
do
{
CursorPath = $"?cursor={cursor}";
if (cursor == null) CursorPath = string.Format("");
FullUrl = string.Format("{0}{1}{2}", BaseUrl, RequestPath, CursorPath);
response = await client.GetAsync(FullUrl);
content = await response.Content.ReadAsStringAsync();
var nextProducts = Newtonsoft.Json.JsonConvert.DeserializeObject<List<Products>>(content);
// add Products in the next page.
Products.AddRange(nextProducts);
values = response.Headers.GetValues("cursor");
cursor = values?.FirstOrDefault();
System.Threading.Thread.Sleep(1000);
Console.WriteLine(FullUrl);
Console.WriteLine(response);
} while (cursor != null);
return Products;
}
此处使用 SQL 存储过程进行插入:
using (SqlConnection conn = new SqlConnection(lConnString))
{
conn.Open();
using (TransactionScope ts = new TransactionScope())
{
foreach (var repo in products)
{
SqlCommand cmdIns = new SqlCommand("usp_insert_Products", conn);
cmdIns.CommandType = CommandType.StoredProcedure;
cmdIns.Parameters.AddWithValue("@ProductId", repo.ProductId.ToString() ?? (object)DBNull.Value);
cmdIns.Parameters.AddWithValue("@ProductDetailId", repo.ProductDetailId.ToString() ?? (object)DBNull.Value);
cmdIns.ExecuteNonQuery();
}
ts.Complete();
}
conn.Close();
我提供的示例代码有一个完全不同的方法,如果我不能让我的代码正常运行,我正处于转向的风口浪尖:
示例代码
// Paging is handled by making a request and then making
// follow up requests as long as a "cursor" is returned.
string cursor = null;
do
{
var query = HttpUtility.ParseQueryString("");
query["locationId"] = "1";
query["businessDate"] = "2019-04-30";
if (cursor != null) query["cursor"] = cursor;
var fullUrl = $"{url}/{endpoint}?{query}";
_testOutputHelper.WriteLine(fullUrl);
var json = client.DownloadString(fullUrl);
results.AddRange(
JsonConvert.DeserializeObject<List<Check>>(json));
cursor = client.ResponseHeaders["cursor"];
} while (cursor != null);
}
如果找不到 header,您正在使用 response.Headers.GetValues("cursor")
即 documented 抛出 InvalidOperationException
。
您应该改用 TryGetValues
:
if (response.Headers.TryGetValues("cursor", out IEnumerable<string> values))
{
// header exists
}
else
{
// header doesn't exist
}