Отправка 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
Ларс Перссон