Отправка JSON в URL-адрес через WebClient в C #


89

У меня есть код JavaScript, который мне нужно преобразовать в C #. Мой код JavaScript отправляет часть JSON в созданную веб-службу. Этот код JavaScript работает нормально и выглядит следующим образом:

var vm = { k: "1", a: "2", c: "3", v: "4" };
$.ajax({
  url: "http://www.mysite.com/1.0/service/action",
  type: "POST",
  data: JSON.stringify(vm),
  contentType: "application/json;charset=utf-8",
  success: action_Succeeded,
  error: action_Failed
});

function action_Succeeded(r) {
  console.log(r);
}

function log_Failed(r1, r2, r3) {
  alert("fail");
}

Я пытаюсь понять, как преобразовать это в C #. Мое приложение использует .NET 2.0. Насколько я могу судить, мне нужно сделать что-то вроде следующего:

using (WebClient client = new WebClient())
{
  string json = "?";
  client.UploadString("http://www.mysite.com/1.0/service/action", json);
}

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

Может кто-нибудь сказать мне, что мне здесь не хватает?

Спасибо!

Ответы:


70

Вам нужен сериализатор json для анализа вашего контента, возможно, он у вас уже есть, для вашего первоначального вопроса о том, как сделать запрос, это может быть идея:

var baseAddress = "http://www.example.com/1.0/service/action";

var http = (HttpWebRequest)WebRequest.Create(new Uri(baseAddress));
http.Accept = "application/json";
http.ContentType = "application/json";
http.Method = "POST";

string parsedContent = <<PUT HERE YOUR JSON PARSED CONTENT>>;
ASCIIEncoding encoding = new ASCIIEncoding();
Byte[] bytes = encoding.GetBytes(parsedContent);

Stream newStream = http.GetRequestStream();
newStream.Write(bytes, 0, bytes.Length);
newStream.Close();

var response = http.GetResponse();

var stream = response.GetResponseStream();
var sr = new StreamReader(stream);
var content = sr.ReadToEnd();

Надеюсь, это поможет,


1
как должен выглядеть parsedContent? К сожалению, в этом сценарии мне нужно вручную создать свой JSON. Спасибо.
— Eels Fan

Может ли это просто выглядеть как JSON? Или мне нужно сделать какую-то специальную кодировку - вот что я имею в виду.
— Eels Fan

@EelsFan обычно не проблема выбрать любой парсер JSON, вы всегда можете JSON.Net для синтаксического анализа объекта .net в JSON, но по моему опыту были некоторые облачные службы, которые имели другую версию парсера JSON, и мне пришлось сделать некоторые твики. Сделайте то, что лучше всего подходит для вашего сценария, это обсуждение может помочь вам также увидеть некоторые проблемы без JSON.Net stackoverflow.com/questions/9573119/…
— Хорхе Альварадо,

5
Почему вы используете ASCIIEncoding, а не UTF8? См. Stackoverflow.com/a/9254967/109392 .
— awe

2
+1 Я сначала попробовал использовать аналогичный OP WebClient, но не заработал. Затем я попробовал это решение, и оно сработало отлично. Я использовал UTF8Encodingвместо этого ASCIIEncodingдля создания байтового массива, потому что я не вижу причин использовать ASCII, который уменьшает доступные символы недопустимым образом. В кодировке ASCII всего 127 символов.
— awe

197

На вопрос уже дан ответ, но я думаю, что нашел решение, которое проще и более соответствует заголовку вопроса, вот оно:

var cli = new WebClient();
cli.Headers[HttpRequestHeader.ContentType] = "application/json";
string response = cli.UploadString("http://some/address", "{some:\"json data\"}");

PS: В большинстве реализаций .net, но не во всех, WebClient является IDisposable, поэтому, конечно, лучше использовать для него 'using' или 'Dispose'. Однако в данном конкретном случае в этом нет необходимости .


1
И, чтобы сделать ваш json "читаемым": (в vb.net) Dim json = <JSON> {"field1": "value1", "status": "pending", "objField": {"field2": true} } </JSON> .ToString
— foxontherock

Но как насчет инерполяции параметров в эту строку json?
— Тали Б.

74

В следующем примере показано, как отправить JSON на POST с помощью метода WebClient.UploadString :

var vm = new { k = "1", a = "2", c = "3", v=  "4" };
using (var client = new WebClient())
{
   var dataString = JsonConvert.SerializeObject(vm);
   client.Headers.Add(HttpRequestHeader.ContentType, "application/json");
   client.UploadString(new Uri("http://www.contoso.com/1.0/service/action"), "POST", dataString);
}

Предварительные требования: библиотека Json.NET


4
Я думаю, что это должно быть UploadStringAsync, если вы используете завершенное событие.
— Sam Mackrill

Вы можете опустить POSTаргумент, так как UploadStringэтот метод неявно используется по умолчанию. Кроме того, вы можете добавить, client.Headers.Add(HttpRequestHeader.Accept, "application/json");если ожидаете JSONвозврата.
— jimasun

Реализует ли WebClient IDisposable? Несколько лет спустя я работаю в .NET Framework 4.7.1 и не вижу этого.
— bubbleking

2
@bubbleking Я нажал F12 в WebClient и увидел, что это компонент, а компонент реализует IDisposablepublic class WebClient : Component public class Component : MarshalByRefObject, IComponent, IDisposable
— Ларс Перссон
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.