我想知道如何使用另一个 ASP.Net Web API 的 WEBAPI 来将响应存储在数据库中。我知道如何从 javascript、控制台应用程序等客户端使用 WEBAPI。
但要求是通过我的 WEBAPI 从第三方 API 提取数据并将结果存储在数据库中,以便使用我的 WEBAPI 的客户向我请求数据。
是否可以使用 Asp.Net Web API 做到这一点?
我想知道如何使用另一个 ASP.Net Web API 的 WEBAPI 来将响应存储在数据库中。我知道如何从 javascript、控制台应用程序等客户端使用 WEBAPI。
但要求是通过我的 WEBAPI 从第三方 API 提取数据并将结果存储在数据库中,以便使用我的 WEBAPI 的客户向我请求数据。
是否可以使用 Asp.Net Web API 做到这一点?
在本教程中解释了如何使用 C# 使用Web api,在此示例中使用控制台应用程序,但您当然也可以使用另一个Web api来使用。
http://www.asp.net/web-api/overview/web-api-clients/calling-a-web-api-from-a-net-client
你应该看看HttpClient
HttpClient client = new HttpClient();
client.BaseAddress = new Uri("http://localhost/yourwebapi");
使用 Accept 标头确保您的请求以 JSON 格式请求响应,如下所示:
client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/json"));
现在是与教程不同的部分,请确保您具有与其他对象相同的对象WEB API
,如果没有,则必须将对象映射到您自己的对象。ASP.NET
会将JSON
您收到的内容转换为您想要的对象。
HttpResponseMessage response = client.GetAsync("api/yourcustomobjects").Result;
if (response.IsSuccessStatusCode)
{
var yourcustomobjects = response.Content.ReadAsAsync<IEnumerable<YourCustomObject>>().Result;
foreach (var x in yourcustomobjects)
{
//Call your store method and pass in your own object
SaveCustomObjectToDB(x);
}
}
else
{
//Something has gone wrong, handle it here
}
请注意,我.Result
用于示例的情况。您应该考虑在async
await
此处使用该模式。
由于某些无法解释的原因,这个解决方案对我不起作用(可能是一些类型不兼容),所以我为自己想出了一个解决方案:
HttpResponseMessage response = await client.GetAsync("api/yourcustomobjects");
if (response.IsSuccessStatusCode)
{
var data = await response.Content.ReadAsStringAsync();
var product = JsonConvert.DeserializeObject<Product>(data);
}
这样,我的内容被解析为 JSON 字符串,然后我将其转换为我的对象。
public class EmployeeApiController : ApiController
{
private readonly IEmployee _employeeRepositary;
public EmployeeApiController()
{
_employeeRepositary = new EmployeeRepositary();
}
public async Task<HttpResponseMessage> Create(EmployeeModel Employee)
{
var returnStatus = await _employeeRepositary.Create(Employee);
return Request.CreateResponse(HttpStatusCode.OK, returnStatus);
}
}
持久性
public async Task<ResponseStatusViewModel> Create(EmployeeModel Employee)
{
var responseStatusViewModel = new ResponseStatusViewModel();
var connection = new SqlConnection(EmployeeConfig.EmployeeConnectionString);
var command = new SqlCommand("usp_CreateEmployee", connection);
command.CommandType = CommandType.StoredProcedure;
var pEmployeeName = new SqlParameter("@EmployeeName", SqlDbType.VarChar, 50);
pEmployeeName.Value = Employee.EmployeeName;
command.Parameters.Add(pEmployeeName);
try
{
await connection.OpenAsync();
await command.ExecuteNonQueryAsync();
command.Dispose();
connection.Dispose();
}
catch (Exception ex)
{
throw ex;
}
return responseStatusViewModel;
}
存储库
Task<ResponseStatusViewModel> Create(EmployeeModel Employee);
public class EmployeeConfig
{
public static string EmployeeConnectionString;
private const string EmployeeConnectionStringKey = "EmployeeConnectionString";
public static void InitializeConfig()
{
EmployeeConnectionString = GetConnectionStringValue(EmployeeConnectionStringKey);
}
private static string GetConnectionStringValue(string connectionStringName)
{
return Convert.ToString(ConfigurationManager.ConnectionStrings[connectionStringName]);
}
}