Не могу понять, как использовать этот API в C # - PullRequest
0 голосов
/ 03 июня 2019

Простите за недостаток знаний, я парень из базы данных, хотя некоторое время назад немного баловался с C #. Я пытаюсь понять, как запустить этот API.

API, который я пытаюсь использовать, взят из https://rapidapi.com/api-sports/api/api-nba/. Нет практически никакой документации, которая могла бы мне помочь.

Вот мой код:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using unirest_net.http;
using unirest_net;

namespace NBA_test
{
    class Program
    {
        public static void Main(string[] args)
        {
            Console.WriteLine("Start ...");

            Task<HttpResponse<MyClass.RootObject>> response = Unirest.get("https://api-nba-v1.p.rapidapi.com/gameDetails/5162")
            .header("X-RapidAPI-Host", "api-nba-v1.p.rapidapi.com")
            .header("X-RapidAPI-Key", "myKey")
            .asJsonAsync<MyClass.RootObject>();

            var status = response.Status;

            Console.WriteLine("End ....");
        }
    }

    public class MyClass
    {
        public class Result
        {
            public string seasonYear { get; set; }
            public int gameId { get; set; }
            public string arena { get; set; }
        }

        public class RootObject
        {
            public List<Result> results { get; set; }
        }
    }
}

var status переходит из состояния «Создано» в режим «Выполнено», и все, программа закрывается. Нет сообщения об ошибке, но я не знаю, как получить JSON из этого API. Я знаю, что что-то упустил, но не знаю что.

Ответы [ 4 ]

1 голос
/ 03 июня 2019

Вы находитесь в консольном приложении с методом sync main. Вы не должны вызывать async метод внутри sync метода. Я сделал ваш async звонок в sync звонок:

    public static void Main(string[] args)
    {
        Console.WriteLine("Start ...");

        var response = Unirest.get("https://api-nba-v1.p.rapidapi.com/gameDetails/5162")
        .header("X-RapidAPI-Host", "api-nba-v1.p.rapidapi.com")
        .header("X-RapidAPI-Key", "myKey")
        .asJson<RootObject>();

        var status = response.Status;

        Console.WriteLine("End ....");
    }

Вы все еще можете спросить, где ваша десериализация JSON?

Согласно Unirest Docs :

Ответ После получения ответа Unirest возвращает результат в форма объекта, этот объект всегда должен иметь одинаковые ключи для каждый язык в отношении деталей ответа.

.Code - код состояния ответа HTTP (пример 200) .Headers - HTTP Заголовки ответа .Body - анализируемое тело ответа, где это применимо, для Примеры ответов JSON анализируются для объектов / ассоциативных массивов. .Raw - непроанализированное тело ответа

По сути, вы можете получить доступ к своему результату так:

if (response.Code == 200) // Success, OK in HTTP Codes
{
  response.Body; // which body has the type of MyClass.RootObject
}

Полный пример:

        public static void Main(string[] args)
        {
            Console.WriteLine("Start ...");

            var response = Unirest.get("https://api-nba-v1.p.rapidapi.com/gameDetails/5162")
            .header("X-RapidAPI-Host", "api-nba-v1.p.rapidapi.com")
            .header("X-RapidAPI-Key", "myKey")
            .asJson<RootObject>();

            if (response.Code == 200) // Success, OK in HTTP Codes
            {
              response.Body; // which body has the type of MyClass.RootObject
            }

            Console.WriteLine("End ....");

            Console.ReadLine(); // to force command line stay up for an input and not close applicaiton immediately aftter runing it.
        }

Обновление 1:

Вот и работает Unirest на .NET Fiddle:

https://dotnetfiddle.net/EZDopa

0 голосов
/ 30 июня 2019

Оказывается, документация API имеет недостатки. Мне удалось заставить его работать, просто используя строку (и Json.NET от Newtonsoft). Спасибо за помощь @AliBahrami. Код выглядит следующим образом:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using unirest_net.http;
using unirest_net;
using Newtonsoft.Json.Linq;

namespace NBA_test
{
    public class Program
    {

        public static void Main(string[] args)
        {

            Console.WriteLine("Start of Program...");

            HttpResponse<string> response = Unirest.get("https://api-nba-v1.p.rapidapi.com/gameDetails/9999")
            .header("X-RapidAPI-Host", "api-nba-v1.p.rapidapi.com")
            .header("X-RapidAPI-Key", "myKey")
            .asJson<string>();

            var result = response.Body;

            JObject parsedString = JObject.Parse(result);

            RootObject myGame = parsedString.ToObject<RootObject>();

            // Get game id
            Console.WriteLine(myGame.results[0].gameId);

            Console.WriteLine("End of Program....");
        }
    }
}
0 голосов
/ 03 июня 2019

Вы можете использовать httpClient

   using (var httpClient = new HttpClient())
        {
            httpClient.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36");
            var response = httpClient.GetStringAsync(new Uri(url)).Result;
            var releases = JArray.Parse(response);
        }
0 голосов
/ 03 июня 2019

Как отмечали другие, вам нужно добавить что-то вроде ожидания. Я сделал много вызовов API, которые заняли время для обработки в одном из моих приложений. Основываясь на других комментариях, я обновил их, чтобы можно было выполнять логику во время ожидания ответа на звонок. Правка для вашего кода:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using unirest_net.http;
using unirest_net;

namespace NBA_test
{
class Program
{
    public static void Main(string[] args)
    {
        Console.WriteLine("Start ...");
        //the added Wait() causes the thread to hold until the task is finished.
        Task<HttpResponse<MyClass.RootObject>> response = Unirest.get("https://api-nba-v1.p.rapidapi.com/gameDetails/5162")
        .header("X-RapidAPI-Host", "api-nba-v1.p.rapidapi.com")
        .header("X-RapidAPI-Key", "myKey")
        .asJsonAsync<MyClass.RootObject>();


        //if need to perform other logic while you are waiting
        while(response.Status == TaskStatus.Running)
        {
         // perform other logic like gui here
        }
        var status = response.Status;

        Console.WriteLine("End ....");
    }
}

public class MyClass
{
    public class Result
    {
        public string seasonYear { get; set; }
        public int gameId { get; set; }
        public string arena { get; set; }
    }

    public class RootObject
    {
        public List<Result> results { get; set; }
    }
}

}

...