Как я могу использовать NewsApi.org в моем проекте UWP? - PullRequest
0 голосов
/ 12 февраля 2020

Я использую C# и UWP xml для создания новостной ленты. Как виджет новостей телефона, но для компьютера. Я наткнулся на https://newsapi.org/ и подумал, что это интересно. Но я не знаю, как это реализовать, и на C# для этого веб-сайта API нет учебных пособий. Как мне это использовать и как показать article.Title, article.Author и article.Description на 3 созданных мною текстовых блоках?

edit: я нашел видео для c#, но оно для консоли .writeline, а не xaml. Поэтому я создал новый файл class.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using NewsAPI;
using NewsAPI.Models;
using NewsAPI.Constants;
using System.Net.Http;
using Newtonsoft.Json;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;
using System.IO;

namespace news
{
public class newsapi
{
    HttpClient client = new HttpClient();
    //public static async void Main(string[] args)
    //{

    //    newsapi program = new newsapi();
    //    await program.GetArticles();
    //}
    //public async Task GetArticles()
    //{
    //    string response = await client.GetStringAsync("https://newsapi.org/v2/top-headlines?sources=bbc-news&apiKey=06112b69bb054cfeb70bbf188873f98e");
    //    NewsResponse newsObject = JsonConvert.DeserializeObject<NewsResponse>(response);
    //}

    public async static Task<Article> GetArticlesMain()
    {
        var http = new HttpClient();
        var response = await http.GetAsync("https://newsapi.org/v2/top-headlines?sources=bbc-news&apiKey=06112b69bb054cfeb70bbf188873f98e");
        var result = await response.Content.ReadAsStringAsync();
        var serializer = new DataContractJsonSerializer(typeof(Article));

        var ms = new MemoryStream(Encoding.UTF8.GetBytes(result));
        var data = (Article)serializer.ReadObject(ms);

        return data;
    }

    [DataContract]
    public class NewsResponse
    {
        [DataMember]
        public string status { get; set; }
        [DataMember]
        public int totalResults { get; set; }
        [DataMember]
        public List<Article> Articles { get; set; }
    }
    [DataContract]
    public class Article
    {
        [DataMember]
        public string Title { get; set; }
    }

    }
}

и попытался получить заголовок API новостей в моем mainpage.xaml в текстовом блоке в событии page_loaded:

        private async void Page_Loaded(object sender, RoutedEventArgs e)
    {
        //RootObject myWeather = await OpenWeather.GetWeather(20, 30);
        Article article = await newsapi.GetArticlesMain();
        tbContent.Text = article.Title;

    }

Но текстовый блок ничего не показывает, и исключение, необработанное пользователем, было выброшено в "tbContent.Text = article.Title" этой строке, говорящей "Значение не может быть нулевым". Так что происходит и как это исправить?

1 Ответ

1 голос
/ 12 февраля 2020

Когда вы получаете строку Json из сети, если вы хотите преобразовать в тип, вам нужно предоставить класс, соответствующий структуре json.

var serializer = new DataContractJsonSerializer(typeof(Article));

Вот Основная проблема, полученная строка json должна иметь тип NewsResponse, поэтому она должна выглядеть следующим образом:

var serializer = new DataContractJsonSerializer(typeof(Article));

Это полный процесс:

News.cs

public class NewsApi
{
    public async static Task<List<Article>> GetArticlesMain()
    {
        var http = new HttpClient();
        var response = await http.GetAsync("your_news_url");
        var result = await response.Content.ReadAsStringAsync();
        var data = JsonConvert.DeserializeObject<NewsResponse>(result);

        return data.articles;
    }
}

public class NewsResponse
{
    public string status { get; set; }
    public int totalResults { get; set; }
    public List<Article> articles { get; set; }
}

public class Article
{
    public Source source { get; set; }
    public string author { get; set; }
    public string title { get; set; }
    public string description { get; set; }
    public string url { get; set; }
    public string urlToImage { get; set; }
    public DateTime publishedAt { get; set; }
    public string content { get; set; }
}

public class Source
{
    public string id { get; set; }
    public string name { get; set; }
}

News.xaml.cs

private async void Page_Loaded(object sender, RoutedEventArgs e)
{
    List<Article> articles = await NewsApi.GetArticlesMain();
    tbContent.Text = articles.First().title;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...