Отправка 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.