简体   繁体   中英

Wordpress data in Maui using Wp API, Json attempting to process

I'm trying to figure out what is the problem for recover data from Wordpress site inside my MAUI application. I type my model using Json2csharp:

    public class WpPost
{
    // Root myDeserializedClass = JsonSerializer.Deserialize<List<Root>>(myJsonResponse);
    public class About
    {
        [JsonPropertyName("href")]
        public string Href;
    }

    public class Author
    {
        [JsonPropertyName("name")]
        public string Name;

        [JsonPropertyName("@id")]
        public string Id;

        [JsonPropertyName("embeddable")]
        public bool Embeddable;

        [JsonPropertyName("href")]
        public string Href;
    }

    public class Breadcrumb
    {
        [JsonPropertyName("@id")]
        public string Id;
    }

    public class Collection
    {
        [JsonPropertyName("href")]
        public string Href;
    }

    public class Content
    {
        [JsonPropertyName("rendered")]
        public string Rendered;

        [JsonPropertyName("protected")]
        public bool Protected;
    }

    public class Cury
    {
        [JsonPropertyName("name")]
        public string Name;

        [JsonPropertyName("href")]
        public string Href;

        [JsonPropertyName("templated")]
        public bool Templated;
    }

    public class Excerpt
    {
        [JsonPropertyName("rendered")]
        public string Rendered;

        [JsonPropertyName("protected")]
        public bool Protected;
    }

    public class Graph
    {
        [JsonPropertyName("@type")]
        public object Type;

        [JsonPropertyName("@id")]
        public string Id;

        [JsonPropertyName("url")]
        public string Url;

        [JsonPropertyName("name")]
        public string Name;

        [JsonPropertyName("description")]
        public string Description;

        [JsonPropertyName("publisher")]
        public Publisher Publisher;

        [JsonPropertyName("potentialAction")]
        public List<PotentialAction> PotentialAction;

        [JsonPropertyName("inLanguage")]
        public string InLanguage;

        [JsonPropertyName("isPartOf")]
        public IsPartOf IsPartOf;

        [JsonPropertyName("datePublished")]
        public DateTime? DatePublished;

        [JsonPropertyName("dateModified")]
        public DateTime? DateModified;

        [JsonPropertyName("breadcrumb")]
        public Breadcrumb Breadcrumb;

        [JsonPropertyName("itemListElement")]
        public List<ItemListElement> ItemListElement;

        [JsonPropertyName("author")]
        public Author Author;

        [JsonPropertyName("headline")]
        public string Headline;

        [JsonPropertyName("mainEntityOfPage")]
        public MainEntityOfPage MainEntityOfPage;

        [JsonPropertyName("wordCount")]
        public int? WordCount;

        [JsonPropertyName("commentCount")]
        public int? CommentCount;

        [JsonPropertyName("articleSection")]
        public List<string> ArticleSection;

        [JsonPropertyName("image")]
        public Image Image;

        [JsonPropertyName("logo")]
        public Logo Logo;
    }

    public class Guid
    {
        [JsonPropertyName("rendered")]
        public string Rendered;
    }

    public class Image
    {
        [JsonPropertyName("@type")]
        public string Type;

        [JsonPropertyName("inLanguage")]
        public string InLanguage;

        [JsonPropertyName("@id")]
        public string Id;

        [JsonPropertyName("url")]
        public string Url;

        [JsonPropertyName("contentUrl")]
        public string ContentUrl;

        [JsonPropertyName("caption")]
        public string Caption;
    }

    public class IsPartOf
    {
        [JsonPropertyName("@id")]
        public string Id;
    }

    public class ItemListElement
    {
        [JsonPropertyName("@type")]
        public string Type;

        [JsonPropertyName("position")]
        public int Position;

        [JsonPropertyName("name")]
        public string Name;

        [JsonPropertyName("item")]
        public string Item;
    }

    public class Links
    {
        [JsonPropertyName("self")]
        public List<Self> Self;

        [JsonPropertyName("collection")]
        public List<Collection> Collection;

        [JsonPropertyName("about")]
        public List<About> About;

        [JsonPropertyName("author")]
        public List<Author> Author;

        [JsonPropertyName("replies")]
        public List<Reply> Replies;

        [JsonPropertyName("version-history")]
        public List<VersionHistory> VersionHistory;

        [JsonPropertyName("predecessor-version")]
        public List<PredecessorVersion> PredecessorVersion;

        [JsonPropertyName("wp:attachment")]
        public List<WpAttachment> WpAttachment;

        [JsonPropertyName("wp:term")]
        public List<WpTerm> WpTerm;

        [JsonPropertyName("curies")]
        public List<Cury> Curies;
    }

    public class Logo
    {
        [JsonPropertyName("@id")]
        public string Id;
    }

    public class MainEntityOfPage
    {
        [JsonPropertyName("@id")]
        public string Id;
    }

    public class Meta
    {
        [JsonPropertyName("jetpack_publicize_message")]
        public string JetpackPublicizeMessage;

        [JsonPropertyName("jetpack_is_tweetstorm")]
        public bool JetpackIsTweetstorm;

        [JsonPropertyName("jetpack_publicize_feature_enabled")]
        public bool JetpackPublicizeFeatureEnabled;
    }

    public class OgImage
    {
        [JsonPropertyName("url")]
        public string Url;
    }

    public class PotentialAction
    {
        [JsonPropertyName("@type")]
        public string Type;

        [JsonPropertyName("target")]
        public object Target;

        [JsonPropertyName("query-input")]
        public string QueryInput;

        [JsonPropertyName("name")]
        public string Name;
    }

    public class PredecessorVersion
    {
        [JsonPropertyName("id")]
        public int Id;

        [JsonPropertyName("href")]
        public string Href;
    }

    public class Publisher
    {
        [JsonPropertyName("@id")]
        public string Id;
    }

    public class Reply
    {
        [JsonPropertyName("embeddable")]
        public bool Embeddable;

        [JsonPropertyName("href")]
        public string Href;
    }

    public class Robots
    {
        [JsonPropertyName("index")]
        public string Index;

        [JsonPropertyName("follow")]
        public string Follow;

        [JsonPropertyName("max-snippet")]
        public string MaxSnippet;

        [JsonPropertyName("max-image-preview")]
        public string MaxImagePreview;

        [JsonPropertyName("max-video-preview")]
        public string MaxVideoPreview;
    }

    public class Root
    {
        [JsonPropertyName("id")]
        public int Id;

        [JsonPropertyName("date")]
        public DateTime Date;

        [JsonPropertyName("date_gmt")]
        public DateTime DateGmt;

        [JsonPropertyName("guid")]
        public Guid Guid;

        [JsonPropertyName("modified")]
        public DateTime Modified;

        [JsonPropertyName("modified_gmt")]
        public DateTime ModifiedGmt;

        [JsonPropertyName("slug")]
        public string Slug;

        [JsonPropertyName("status")]
        public string Status;

        [JsonPropertyName("type")]
        public string Type;

        [JsonPropertyName("link")]
        public string Link;

        [JsonPropertyName("title")]
        public Title Title;

        [JsonPropertyName("content")]
        public Content Content;

        [JsonPropertyName("excerpt")]
        public Excerpt Excerpt;

        [JsonPropertyName("author")]
        public int Author;

        [JsonPropertyName("featured_media")]
        public int FeaturedMedia;

        [JsonPropertyName("comment_status")]
        public string CommentStatus;

        [JsonPropertyName("ping_status")]
        public string PingStatus;

        [JsonPropertyName("sticky")]
        public bool Sticky;

        [JsonPropertyName("template")]
        public string Template;

        [JsonPropertyName("format")]
        public string Format;

        [JsonPropertyName("meta")]
        public Meta Meta;

        [JsonPropertyName("categories")]
        public List<int> Categories;

        [JsonPropertyName("tags")]
        public List<object> Tags;

        [JsonPropertyName("jetpack_publicize_connections")]
        public List<object> JetpackPublicizeConnections;

        [JsonPropertyName("yoast_head")]
        public string YoastHead;

        [JsonPropertyName("yoast_head_json")]
        public YoastHeadJson YoastHeadJson;

        [JsonPropertyName("jetpack_featured_media_url")]
        public string JetpackFeaturedMediaUrl;

        [JsonPropertyName("jetpack_sharing_enabled")]
        public bool JetpackSharingEnabled;

        [JsonPropertyName("jetpack_likes_enabled")]
        public bool JetpackLikesEnabled;

        [JsonPropertyName("_links")]
        public Links Links;
    }

    public class Schema
    {
        [JsonPropertyName("@context")]
        public string Context;

        [JsonPropertyName("@graph")]
        public List<Graph> Graph;
    }

    public class Self
    {
        [JsonPropertyName("href")]
        public string Href;
    }

    public class Title
    {
        [JsonPropertyName("rendered")]
        public string Rendered;
    }

    public class TwitterMisc
    {
        [JsonPropertyName("Scritto da")]
        public string ScrittoDa;

        [JsonPropertyName("Tempo di lettura stimato")]
        public string TempoDiLetturaStimato;
    }

    public class VersionHistory
    {
        [JsonPropertyName("count")]
        public int Count;

        [JsonPropertyName("href")]
        public string Href;
    }

    public class WpAttachment
    {
        [JsonPropertyName("href")]
        public string Href;
    }

    public class WpTerm
    {
        [JsonPropertyName("taxonomy")]
        public string Taxonomy;

        [JsonPropertyName("embeddable")]
        public bool Embeddable;

        [JsonPropertyName("href")]
        public string Href;
    }

    public class YoastHeadJson
    {
        [JsonPropertyName("title")]
        public string Title;

        [JsonPropertyName("description")]
        public string Description;

        [JsonPropertyName("robots")]
        public Robots Robots;

        [JsonPropertyName("canonical")]
        public string Canonical;

        [JsonPropertyName("og_locale")]
        public string OgLocale;

        [JsonPropertyName("og_type")]
        public string OgType;

        [JsonPropertyName("og_title")]
        public string OgTitle;

        [JsonPropertyName("og_description")]
        public string OgDescription;

        [JsonPropertyName("og_url")]
        public string OgUrl;

        [JsonPropertyName("og_site_name")]
        public string OgSiteName;

        [JsonPropertyName("article_published_time")]
        public DateTime ArticlePublishedTime;

        [JsonPropertyName("article_modified_time")]
        public DateTime ArticleModifiedTime;

        [JsonPropertyName("og_image")]
        public List<OgImage> OgImage;

        [JsonPropertyName("author")]
        public string Author;

        [JsonPropertyName("twitter_card")]
        public string TwitterCard;

        [JsonPropertyName("twitter_misc")]
        public TwitterMisc TwitterMisc;

        [JsonPropertyName("schema")]
        public Schema Schema;
    }

I've created a service and injected it in singleton way inside my ViewModel, Service:

public Tive6Service()
    {
        _httpClient = new HttpClient();
    }

    public async Task<IEnumerable<WpPost>> GetAllWpPostsAsync()
    {            
        try
        {
            var response = await _httpClient.GetAsync(UriString + "/wp/v2/posts");
            if (response.IsSuccessStatusCode)
            {
                posts = await response.Content.ReadFromJsonAsync<IEnumerable<WpPost>>();
            }
            
        }
        catch (Exception e)
        {
            await Shell.Current.DisplayAlert("Error", e.Message, "Cancel");
        }
        return posts;
    }

    public async Task<WpPost> GetPostAsync(int id)
    {
        try
        {
            var response = await _httpClient.GetAsync(UriString + "/wp/v2/posts"+ id.ToString());
            if (response.IsSuccessStatusCode)
            {
                post = await response.Content.ReadFromJsonAsync<WpPost>();
            }

        }
        catch (Exception e)
        {
            await Shell.Current.DisplayAlert("Error", e.Message, "Cancel");
        }
        return post;
    }

ViewModel:

   public NewsViewModel(Tive6Service tive6Service)
    {
        Tive6Service = tive6Service;
        LoadPosts();
       
    }

    Task<ObservableCollection<WpPost>> LoadPosts()
    {            
        posts = new ObservableCollection<WpPost>(Tive6Service.GetAllWpPostsAsync().Result);
        return Task.FromResult(posts);  
    }

But during Debug the application stuck in the thread for recover all the WpPost, without throwing exceptions. Deepen in details, using method

post = await response.Content.ReadAsStringAsync();

it works, so the Web Api of the website are ok, like its swagger show me before that. What and where I'm wrong?

Thanks for your kindness

I've fixed the problem changing the line of code below in Service class:

var response = _httpClient.GetAsync(UriString + "/wp/v2/posts").Result;

Now it works. Thanks to everyone.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM