ВСТАНОВЛЕННЯ JSON у URL-адресу через WebClient в C #


87

У мене є код 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 .
благоговіння

2
+1 Я спочатку спробував схожий на OP WebClient, і не змусив його працювати. Потім я спробував це рішення, і воно спрацювало як шарм. Я використовував UTF8Encodingзамість того, ASCIIEncodingщоб створювати байтовий масив, оскільки я не бачу причин використовувати ASCII, який зменшує доступні символи неприйнятним способом. ASCII містить лише 127 символів у наборі символів.
благоговіння

197

На запитання вже дано відповіді, але, я думаю, я знайшов простіше рішення, яке відповідає назві питання, ось воно:

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

1
І, щоб зробити ваш json "читабельним": (у vb.net) Dim json = <JSON> {"field1": "value1", "status": "pending", "objField": {"field2": true} } </JSON> .ToString
foxontherock

Але як щодо інерполяції параметрів у цей рядок json?
Талі Б.

74

У наведеному нижче прикладі показано, як розмістити JSON за допомогою методу 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 через кілька років, і я цього не бачу.
барботування

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.