ASP.NET Core MVC调用Yelp GraphQL API遇错及解决方案
在ASP.NET Core MVC中调用Yelp GraphQL API的问题解决
问题描述
我正尝试在ASP.NET Core MVC应用中使用GraphQLHttpClient调用Yelp GraphQL API的商家端点,已在客户端实例中配置好API地址和Bearer Token。参照指定的查询结构,仅想获取数据中的Id和Name字段,但调用SendQueryAsync(query)时收到GraphQL错误,不确定是请求参数还是查询语句有误,找不到相关C#调用示例,寻求帮助。
问题已解决
问题涉及多个方面,修复点如下:
- 为Yelp GraphQL查询补充了带变量的必填字段
- 使用
JsonPropertyName特性处理字段大小写匹配问题 - 修复并补充了对应响应结构的实体类
- 通过依赖注入将
SearchConsumer类注入到控制器中
以下是完整实现代码:
实体类与消费者定义
public class Business { [JsonPropertyName("id")] public string Id { get; set; } [JsonPropertyName("name")] public string Name { get; set; } } public class Search { [JsonPropertyName("business")] public List<Business> business { get; set; } } public class SearchResponseType { [JsonPropertyName("search")] public Search Search { get; set; } } public interface ISearchConsumer { Task<List<Business>> GetAllBusinesses(); } public class SearchConsumer : ISearchConsumer { private readonly ApplicationDbContext _dbContext; public SearchConsumer(ApplicationDbContext dbContext) { _dbContext = dbContext; } public async Task<List<Business>> GetAllBusinesses() { var authorization = _dbContext.Authorizations.FirstOrDefault().Token; var _client = new GraphQLHttpClient("https://api.yelp.com/v3/graphql", new NewtonsoftJsonSerializer()); _client.HttpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", authorization); var query = new GraphQLRequest { Query = @" query($termId: String $locationId: String){ search(term:$termId location:$locationId) { business { id name } } }", Variables = new { termId = "burrito", locationId = "san francisco" } }; var response = await _client.SendQueryAsync<SearchResponseType>(query); var businesses = response.Data.Search.business; return businesses; } }
控制器代码
public class YelpGraphQLController : Controller { private readonly ISearchConsumer _consumer; public YelpGraphQLController(ISearchConsumer consumer) { _consumer = consumer; } public IActionResult Index() { return View(); } [HttpGet] public async Task<IActionResult> Get() { var businesses = await _consumer.GetAllBusinesses(); return Ok(businesses); } }
依赖注入配置
ConfigureServices(builder.Services); void ConfigureServices(IServiceCollection services) { services.AddTransient<ISearchConsumer, SearchConsumer>(); }
Yelp GraphQL返回数据示例
{ "data": { "search": { "business": [ { "id": "wGl_DyNxSv8KUtYgiuLhmA", "name": "Bi-Rite Creamery" }, { "id": "lJAGnYzku5zSaLnQ_T6_GQ", "name": "Brenda's French Soul Food" } ] } } }
内容的提问来源于stack exchange,提问作者bliu
相关产品推荐
相关产品推荐

