Гостевая статья CodeFactor, загрузка изображений через REST и Ghost Admin API v2.0

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

Я начал писать его в начале прошлого года, когда вышел API v0.1, чтобы узнать больше об API и оттачивать свои навыки в C #, но это устарело в пользу (намного лучше) API v2.0. В начале этого года я отметил тег v0.1 и .

Использование
Ghost разделяет их API на две проблемные области, в зависимости от того, чего вы хотите достичь - и . Первый касается доступа только для чтения, позволяющего потребителям отображать общедоступные данные, тогда как второй касается создания и управления (администрирования) этих же данных.

Чтобы начать использовать его, и зацепите сгенерированный ключ Content API и ключ API администратора. Будьте осторожны, с кем вы им делитесь, особенно с ключом API администратора ... при этом кто-то может изменить (или удалить) большую часть данных на вашем сайте!

Доступ к API контента
Чтобы получить доступ к API содержимого, возьмите URL-адрес API и ключ API содержимого на . Получив эти фрагменты информации, вы можете получить доступ к любому «общедоступному» контенту, доступному только для чтения.

Код:
var ghost = new GhostSharp.GhostContentAPI("https://grantwinney.com", "a6d33f1b95ff17adf0f787a70a");
var settings = ghost.GetSettings();

Console.WriteLine($"Welcome to {settings.Title}: {settings.Description}\r\n");
Console.WriteLine($"Navigation: {string.Join(", ", settings.Navigation.Select(x => x.Label))}");


Вывод:

Welcome to Grant Winney: We learn by doing. We've all got something to contribute.

Navigation: Home, APIs, Lambda, Rasp PI, About Me, CV

Доступ к API администратора
Чтобы получить доступ к API администратора, получите URL-адрес API и ключ API администратора, также на . Получив эти фрагменты информации, вы можете получить доступ к «частному» контенту, а также создавать, изменять или даже удалять много «открытого» контента.

Код:
var ghost = new GhostSharp.GhostAdminAPI("https://grantwinney.com",
    "5cf706fd7d4a33066550627a:9e5ed2b90e40f68573b0ccaf4aef666b047fc9867ad285b2e219eed5503bae53");
var site = ghost.GetSite();

Console.WriteLine($"Welcome to <a href='{site.Url}'>{site.Title}</a>\r\n");
Console.WriteLine($"Running Ghost v{site.Version}");


Вывод:

Welcome to <a href=' '>Grant Winney</a>

Running Ghost v2.23

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

Чтобы загрузить изображение, отправьте запрос составных данных из нескольких частей, указав 'Content-Type': 'multipart/form-data;'заголовок ...
Они выкладывают пример использования curlс . Я не пробовал, но это соответствует тому, что они просят.

curl -X POST -F 'file=@/path/to/images/my-image.jpg' -F 'ref=path/to/images/my-image.jpg' -H "Authorization: 'Ghost $token'" https://{admin_domain}/ghost/api/{version}/admin/images/upload/

Но когда я попытался отправить сообщение в конечную точку, используя RestSharp с добавленным заголовком, единственный ответ, который я смог получить, был что-то вроде «пожалуйста, выберите изображение». Я часами изучал, как загрузить файл изображения, и попробовал полдюжины разных способов.

Код:
var request = new RestRequest("images/upload/", Method.POST);

request.AddHeader("Content-Type", "multipart/form-data");

Решение? Удалить заголовок. 🤬

Код:
var request = new RestRequest("images/upload/", Method.POST);

if (image.FilePath != null)
    request.AddFile("file", image.FilePath, GetMimeType(image.ImageType));
else
    request.AddFile("file", image.File, image.FileName, GetMimeType(image.ImageType));

request.AddParameter("purpose", image.Purpose.ToString().ToLower());
request.AddParameter("ref", image.Reference);

return Execute<ImageResponse>(request).Images[0];  // adds authentication and execute s the query


Я понятия не имею, почему это было проблемой, и у меня мало желания копаться в кишках RestSharp, чтобы понять это. Каким-то образом этот заголовок испортил запрос, так что Ghost подумал, что изображение не загружается. Может я неправильно использовал шапку? Добавление файла некорректно для работы с этим заголовком? Может быть AddFile(), что-то скрывается за кулисами, что сделало все это очень-очень неправильным?

Ну что ж!

Чему я научился?
Грузы ...

JsonProperty
Если вам нужно получить / опубликовать поля с нижними или нижними подчеркиваниями в них, но вы хотите, чтобы все ваши классы были в паскале (или в другом формате), вам может понадобиться способ перевода между ними. на помощь. Он помогает RestSharp в переводе между именами свойств C # и именами полей JSON.

Код:
namespace GhostSharp.Entities
{
    public class Author
    {
        [JsonProperty("id")]
        public string Id { get; set; }

        [JsonProperty("name")]
        public string Name { get; set; }

        [JsonProperty("profile_image")]
        public string ProfileImage { get; set; }

        [JsonProperty("cover_image")]
        public string CoverImage { get; set; }

Трэвис CI
Потратьте несколько минут, чтобы импортировать в него свои проекты, особенно если у вас есть тесты. Тогда вы можете просто продолжать вносить изменения, весело и головокружительно не зная о последствиях, и у есть ваша спина. Или что-то вроде того.

travisci.png


CodeFactor
- еще один сервис. Он также следит за вашим репо, предлагая исправления кода. У меня было несколько десятков из того, что я бы назвал «косметическими» изменениями - несколько классов в одном файле, лишние пустые строки и т. Д. - но все же было приятно немного почистить вещи и увидеть эту большую зеленую полосу.

codefactor0.png


codefactor1.png


codefactor2.png


Команда Ghost очень отзывчива
Я задал довольно много вопросов на их , и они были полезны ...
Источник:
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!