Загрузка медиафайлов в WordPress API с использованием C# HttpClient

Вопрос или проблема

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

string url = "http://website.at/wp-json/wp/v2/media";
string filename = "C:\\Users\\Schneider David\\Downloads\\pexels-markus-spiske-3039036-scaled.jpg";
string credentials = Convert.ToBase64String(System.Text.Encoding.ASCII.GetBytes("<username>:<password>"));

var headers = new Dictionary<string, string>
{
    { "Authorization", $"Basic {credentials}" },
    { "Accept", "application/json" },
};

HttpClient client = new();

foreach (var header in headers)
{
    client.DefaultRequestHeaders.Add(header.Key, header.Value);
}

StreamContent streamContent = new(new FileStream(filename, FileMode.Open));
streamContent.Headers.ContentType = MediaTypeHeaderValue.Parse("image/jpeg");
streamContent.Headers.ContentDisposition = ContentDispositionHeaderValue.Parse("form-data; filename=testtest.jpg");

using var response = await client.PostAsync(url, streamContent);
if(response.IsSuccessStatusCode)
    Console.WriteLine("Success");
else
    Console.WriteLine("Error");

Измените ваш URL, чтобы он начинался с https:// – похоже, что аутентификация WordPress работает только при использовании TLS, и это в любом случае хорошая практика.

Посмотрите на ответ сервера. Он подскажет вам, что не так. Добавьте Console.WriteLine(await response.Content.ReadAsStringAsync()); в конец, и, вероятно, будет распечатано что-то вроде

    {
        "code": "rest_cannot_create",
        "message": "Извините, вам не разрешено создавать посты от имени этого пользователя.",
        "data": { "status":401 }
    }

Имя пользователя — это имя, которое вы используете для входа на сайт вашего административного интерфейса WordPress (не имя вашего пароля приложения WordPress). Пример: JoeShmoe

Пароль — это значение приложения пароля (не пароль, который вы используете для входа на сайт вашего административного интерфейса WordPress). Обычно выражается как 6 четверок с пробелами, например afev aJbY vrK4 S3Yn fF3R 6cLE

Ответ или решение

Загрузка медиа в WordPress через API с использованием C# и HttpClient может быть сложной задачей, особенно если формат авторизации или контент сформированы неправильно. Рассмотрим пример кода и анализируем возможные ошибки и решения.

Теория

WordPress API предоставляет окно для взаимодействия с сайтом с помощью HTTP-запросов. Это включает в себя загрузку медиафайлов, таких как изображения. Для таких операций требуется правильно настроенная авторизация и правильное формирование HTTP-запроса.

Для успешной загрузки медиа в WordPress необходимо:

  1. Использовать безопасный протокол HTTPS.
  2. Применять корректную базовую авторизацию, используя логин и пароль приложения.
  3. Правильно настроить HttpClient и StreamContent.

Пример

В вашем примере предоставлен код на C# для загрузки изображения через WordPress API. Ниже приведены ключевые этапы кода и возможные исправления:

string url = "https://website.at/wp-json/wp/v2/media"; // Используйте HTTPS
string filename = "C:\\Users\\Schneider David\\Downloads\\pexels-markus-spiske-3039036-scaled.jpg";
string credentials = Convert.ToBase64String(System.Text.Encoding.ASCII.GetBytes("<username>:<application_password>")); // Используйте пароль приложения

var headers = new Dictionary<string, string>
{
    { "Authorization", $"Basic {credentials}" },
    { "Accept", "application/json" },
};

HttpClient client = new();

foreach (var header in headers)
{
    client.DefaultRequestHeaders.Add(header.Key, header.Value);
}

using var fileStream = new FileStream(filename, FileMode.Open);
StreamContent streamContent = new(fileStream);
streamContent.Headers.ContentType = MediaTypeHeaderValue.Parse("image/jpeg");
streamContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data")
{
    FileName = "testtest.jpg"
};

using var response = await client.PostAsync(url, new MultipartFormDataContent { { streamContent, "file", "testtest.jpg" } });

var responseBody = await response.Content.ReadAsStringAsync();
if (response.IsSuccessStatusCode)
{
    Console.WriteLine("Success");
}
else
{
    Console.WriteLine($"Error: {responseBody}");
}

Применение

  1. HTTPS: Убедитесь, что используете HTTPS для URL-адреса API, так как WordPress требует защищенного соединения для авторизации.

  2. Авторизация: Формируйте базовую авторизацию с использованием логина администратора и пароля приложения, а не вашего обычного пароля. Это повысит безопасность и обеспечит успешную аутентификацию.

  3. Контент: Используйте MultipartFormDataContent для отправки файлов на сервер, что требуется для большинства API подобных операций. Представленный код выше включает необходимые изменения.

  4. Ошибки: Если запрос не проходит, выведите тело ответа для диагностики. WordPress возвращает ясные сообщения об ошибках, которые помогут понять, что не так.

Следуя этим рекомендациям, вы сможете успешно загружать медиафайлы в WordPress через API с использованием C#. Выявленные проблемы, такие как использование неверного пароля или небезопасного соединения, могут быть легко исправлены, если следовать приведённым указаниям.

Оцените материал
Добавить комментарий

Капча загружается...