【问题标题】:How to consume a webApi from asp.net Web API to store result in database?如何使用 asp.net Web API 中的 webApi 将结果存储在数据库中?
【发布时间】:2013-10-27 05:45:27
【问题描述】:

我想知道如何使用来自另一个 ASP.Net Web API 的 WEBAPI 来将响应存储在数据库中。 我知道如何从 javascript、控制台应用程序等客户端使用 WEBAPI。

但要求是通过我的 WEBAPI 从第三方 API 提取数据并将结果存储在数据库中,以便使用我的 WEBAPI 的客户向我请求数据。

是否可以使用 Asp.Net Web API 做到这一点?

【问题讨论】:

  • 我在这里没有看到问题。您的客户端本身就是一个 Web API 服务这一事实对您调用 Web API 服务的方式没有任何影响。
  • 请接受答案而不是感谢评论,这样这个问题将不再开放
  • 我尝试过使用 RestSharp,它更简单。获取完整源代码:github.com/garora/somestuff/tree/master/ConsumeWebAPI

标签: c# asp.net asp.net-web-api


【解决方案1】:

本教程介绍了如何使用 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 模式。

【讨论】:

  • 感谢您的回复。
  • 我尝试使用控制台应用程序中的服务并成功。我在从 Asp.Net WebApi 消费同样的问题时遇到了问题。我的查询是: 1. 在 webApi 项目中在哪里编写 httpclient 程序,因为程序应该每天自动执行一次以更新我的数据库? 2.由于我的响应是JSON对象,是否建议使用像mongo db这样的nomysqldbs?
  • 如果你想每天执行一次,为什么还要使用另一个 web api?您可以使用控制台应用程序和 Windows 计划任务,每天执行一次。您的数据库选择完全取决于其他要求。
  • 我需要通过我正在尝试实现的 WEB API 将我的数据库公开给我的客户。它是一项中间服务。架构看起来像.. WEB API(第三方) WEB API 客户端
  • 为什么不使用带有计划任务的控制台应用程序来调用其他 Web API,并使用您自己的 Web API 来公开您的数据库
【解决方案2】:

由于某些无法解释的原因,这个解决方案对我不起作用(可能是某些类型不兼容),所以我自己想出了一个解决方案:

HttpResponseMessage response = await client.GetAsync("api/yourcustomobjects");
if (response.IsSuccessStatusCode)
{
    var data = await response.Content.ReadAsStringAsync();
    var product = JsonConvert.DeserializeObject<Product>(data);
}

这样我的内容被解析为 JSON 字符串,然后我将其转换为我的对象。

【讨论】:

  • 对我来说,在下面的代码行中添加 data.result(而不是数据)“var product = JsonConvert.DeserializeObject(data);”
  • JsonConvert 位于 newtonsoft.json 包中,从 nuget 包管理器中获取 :)
【解决方案3】:
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]);
    }
}

【讨论】:

    猜你喜欢
    • 2017-02-10
    • 2019-03-05
    • 2021-10-21
    • 2022-07-26
    • 1970-01-01
    • 1970-01-01
    • 2018-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多