ВСТАНОВЛЕННЯ 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.