Вот код, который я использую:
// create a request
HttpWebRequest request = (HttpWebRequest)
WebRequest.Create(url); request.KeepAlive = false;
request.ProtocolVersion = HttpVersion.Version10;
request.Method = "POST";
// turn our request string into a byte stream
byte[] postBytes = Encoding.UTF8.GetBytes(json);
// this is important - make sure you specify type this way
request.ContentType = "application/json; charset=UTF-8";
request.Accept = "application/json";
request.ContentLength = postBytes.Length;
request.CookieContainer = Cookies;
request.UserAgent = currentUserAgent;
Stream requestStream = request.GetRequestStream();
// now send it
requestStream.Write(postBytes, 0, postBytes.Length);
requestStream.Close();
// grab te response and print it out to the console along with the status code
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
string result;
using (StreamReader rdr = new StreamReader(response.GetResponseStream()))
{
result = rdr.ReadToEnd();
}
return result;
Когда я запускаю это, я всегда получаю 500 внутренних ошибок сервера.
Что я делаю не так?
c#
json
post
httpwebrequest
Арсен Захрай
источник
источник
Ответы:
Я делаю это и работаю так:
Я написал библиотеку для более простого выполнения этой задачи, она находится здесь: https://github.com/ademargomes/JsonRequest
Надеюсь, поможет.
источник
Решение Адемар может быть улучшена за счет использования
JavaScriptSerializer
«сSerialize
методом , чтобы обеспечить неявное преобразование объекта в JSON.Кроме того, можно использовать функциональные возможности
using
оператора по умолчанию для явного исключения вызоваFlush
иClose
.источник
application/json
правильно.HttpClient
Тип новая реализация , чемWebClient
иHttpWebRequest
.Вы можете просто использовать следующие строки.
Если вам нужно
HttpClient
несколько раз, рекомендуется создать только один экземпляр и использовать его повторно или использовать новыйHttpClientFactory
.источник
HttpClientFactory
. Я не прочитал все ответы в связанной проблеме, но я думаю, что это нуждается в обновлении, поскольку это не упоминает фабрику.В дополнение к посту Шона, нет необходимости вкладывать операторы использования. К
using
в StreamWriter она будет очищена и закрыта в конце блока, нет необходимости явно вызыватьFlush()
иClose()
методы:источник
Если вам нужно вызвать асинхронно, используйте
источник
postStream.Write(postData);
- и в зависимости от API, возможно, придется использоватьrequest.ContentType = "application/json";
вместоtext/json
.Позаботьтесь о типе контента, который вы используете:
Источники:
RFC4627
Другой пост
источник
Недавно я предложил гораздо более простой способ публикации JSON с дополнительным этапом преобразования из модели в моем приложении. Обратите внимание, что вы должны сделать модель [JsonObject] для вашего контроллера, чтобы получить значения и выполнить преобразование.
Запрос:
Модель:
Сторона сервера:
источник
Эта опция не упоминается:
источник
Некоторым другим и чистым способом достижения этого является использование HttpClient следующим образом:
источник
PostAsJsonAsync
больше не доступно, так как .NET 4.5.2. ИспользуйтеPostAsync
вместо этого. Подробнее здесьusing
утвержденииIDisposable
интерфейс по причинеПРЕДУПРЕЖДЕНИЕ! У меня очень сильный взгляд на эту тему.
Существующие веб-клиенты .NET не подходят для разработчиков! WebRequest и WebClient являются яркими примерами того, «как расстроить разработчика». Они многословны и сложны в работе; когда все, что вы хотите сделать, это простой запрос Post в C #. HttpClient помогает решить эти проблемы, но все равно не дотягивает . Кроме того, документация Microsoft плохая… действительно плохая; если вы не хотите просеивать страницы и страницы технической рекламы.
Открытый исходный код на помощь. В качестве альтернативы есть три отличных бесплатных библиотеки NuGet с открытым исходным кодом. Слава Богу! Все они хорошо поддерживаются, документируются и, да, легко - исправляются ... очень легко - работать с ними.
Между ними не так много, но я бы дал ServiceStack.Text небольшое преимущество ...
Итак, как же выглядит Post Post в JSON внутри ServiceStack.Text?
Это одна строка кода. Краткий и легкий! Сравните приведенное выше с библиотеками .NET Http.
источник
Я наконец вызвал в режиме синхронизации, включив .Result
источник
var data = Encoding.ASCII.GetBytes(json);
byte[] postBytes = Encoding.UTF8.GetBytes(json);
Используйте ASCII вместо UFT8
источник