【问题标题】:C# How to Properly Consume Yelp GraphQL apiC# 如何正确使用 Yelp GraphQL api
【发布时间】:2022-09-24 06:36:45
【问题描述】:

我正在尝试使用GraphQLHttpClient 使用我的asp.net core mvc 应用程序调用Yelp 的GraphQL api 的业务端点。我在客户端实例中配置了 api 和 bearer token。我遵循查询结构here,使用业务作为端点,我只想要数据中的 Id 和 Name 字段。当我调用SendQueryAsync(query) 时,我从响应中得到GraphQL 错误。我不确定我是否做错了httprequest 和/或我的查询写错了。我找不到任何关于使用 C# 使用 Yelp 的 GraphQL api 的 YouTube 视频、stackoverflow 问题或 github 项目。任何帮助表示赞赏。谢谢!以下是我的源代码和附加响应。

[更新:已解决]

有一系列问题。向 GraphQL 请求的 YelpGraphQL 查询添加了带有变量的附加必填字段。此thread 中解释了有关查询结构和变量声明的更多信息。覆盖字段的外壳(ty Neil)。修复了 responsetype 类并添加了缺失的类(ty Neil)。通过依赖注入向控制器添加了 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
{
    public 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>();
}

YelpGraphQL Json 数据示例

{
  \"data\": {
    \"search\": {
      \"business\": [
        {
          \"id\": \"wGl_DyNxSv8KUtYgiuLhmA\",
          \"name\": \"Bi-Rite Creamery\"
        },
        {
          \"id\": \"lJAGnYzku5zSaLnQ_T6_GQ\",
          \"name\": \"Brenda\'s French Soul Food\"
        }
      ]
    }
  }
}

Debug GraphQL Error

  • 你能发布你得到的确切错误/异常吗
  • @Neil 在我的控制器获取操作运行后我没有收到错误,但我发布了 GraphQL 调试错误。这有帮助还是你指的是别的东西?
  • 这向我表明您的响应类不正确。将 JSON 响应粘贴到任何 JSON to classes 网站中,并获取正确的类定义。

标签: c# asp.net-mvc api graphql yelp


【解决方案1】:

我猜反序列化不起作用,因为字段与你的类的大小写,你可以像这样覆盖它:

public class Business
{
    [JsonPropertyName("id")]
    public string Id { get; set; }
    [JsonPropertyName("name")]
    public string Name { get; set; }
}

public class ResponseBusinessCollectionType
{
    [JsonPropertyName("businesses")]
    public List<Business> Businesses { get; set; }
}

【讨论】:

    猜你喜欢
    • 2019-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-27
    • 2017-09-19
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    相关资源
    最近更新 更多