Вопрос или проблема
Я пытался сохранить некоторые медиафайлы, но у меня не получается это сделать. Не знаю, связано ли это с тем, что авторизация в неправильном формате, или с тем, что контент просто неправильно размещен. Если кто-то знает, как это сделать, пожалуйста, помогите мне.
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 необходимо:
- Использовать безопасный протокол HTTPS.
- Применять корректную базовую авторизацию, используя логин и пароль приложения.
- Правильно настроить
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}");
}
Применение
-
HTTPS: Убедитесь, что используете HTTPS для URL-адреса API, так как WordPress требует защищенного соединения для авторизации.
-
Авторизация: Формируйте базовую авторизацию с использованием логина администратора и пароля приложения, а не вашего обычного пароля. Это повысит безопасность и обеспечит успешную аутентификацию.
-
Контент: Используйте
MultipartFormDataContent
для отправки файлов на сервер, что требуется для большинства API подобных операций. Представленный код выше включает необходимые изменения. -
Ошибки: Если запрос не проходит, выведите тело ответа для диагностики. WordPress возвращает ясные сообщения об ошибках, которые помогут понять, что не так.
Следуя этим рекомендациям, вы сможете успешно загружать медиафайлы в WordPress через API с использованием C#. Выявленные проблемы, такие как использование неверного пароля или небезопасного соединения, могут быть легко исправлены, если следовать приведённым указаниям.