Отправить JSON по почте в C# и Получить возвращенный JSON?

Это - мой первый раз, который когда-либо будет использовать JSON или даже System.Net и WebRequest часть в любом из моих приложений. Мое приложение, как предполагается, отправляет полезную нагрузку JSON, подобную той ниже к серверу аутентификации:

{
  "agent": {                             
    "name": "Agent Name",                
    "version": 1                                                          
  },
  "username": "Username",                                   
  "password": "User Password",
  "token": "xxxxxx"
}

Для создания этой полезной нагрузки я использовал JSON.NET библиотека. Как я отправил бы эти данные на сервер аутентификации и получил бы его ответ JSON назад? Вот то, что я видел в некоторых примерах, но никаком содержании JSON:

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

string parsedContent = "Parsed JSON Content needs to go here";
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();

Однако это, кажется, много кода compaired к использованию другого langueages, который я использовал в прошлом. Я делаю это правильно? И как я получил бы ответ JSON назад, таким образом, я могу проанализировать его?

Спасибо, элита.

Обновленный код

// Send the POST Request to the Authentication Server
// Error Here
string json = await Task.Run(() => JsonConvert.SerializeObject(createLoginPayload(usernameTextBox.Text, password)));
var httpContent = new StringContent(json, Encoding.UTF8, "application/json");
using (var httpClient = new HttpClient())
{
    // Error here
    var httpResponse = await httpClient.PostAsync("URL HERE", httpContent);
    if (httpResponse.Content != null)
    {
        // Error Here
        var responseContent = await httpResponse.Content.ReadAsStringAsync();
    }
}
62
задан 11 May 2014 в 01:52

3 ответа

Можно создать Ваш HttpContent использование комбинации JObject, чтобы избежать и JProperty и затем звонить ToString() на нем при создании StringContent:

        /*{
          "agent": {                             
            "name": "Agent Name",                
            "version": 1                                                          
          },
          "username": "Username",                                   
          "password": "User Password",
          "token": "xxxxxx"
        }*/

        JObject payLoad = new JObject(
            new JProperty("agent", 
                new JObject(
                    new JProperty("name", "Agent Name"),
                    new JProperty("version", 1)
                    ),
                new JProperty("username", "Username"),
                new JProperty("password", "User Password"),
                new JProperty("token", "xxxxxx")    
                )
            );

        using (HttpClient client = new HttpClient())
        {
            var httpContent = new StringContent(payLoad.ToString(), Encoding.UTF8, "application/json");

            using (HttpResponseMessage response = await client.PostAsync(requestUri, httpContent))
            {
                response.EnsureSuccessStatusCode();
                string responseBody = await response.Content.ReadAsStringAsync();
                return JObject.Parse(responseBody);
            }
        }
5
ответ дан 31 October 2019 в 14:08

Используя пакет JSON.NET NuGet и анонимные типы, можно упростить то, что предлагают другие плакаты:

// ...

string payload = JsonConvert.SerializeObject(new
{
    agent = new
    {
        name    = "Agent Name",
        version = 1,
    },

    username = "username",
    password = "password",
    token    = "xxxxx",
});

var client = new HttpClient();
var content = new StringContent(payload, Encoding.UTF8, "application/json");

HttpResponseMessage response = await client.PostAsync(uri, content);

// ...
3
ответ дан 31 October 2019 в 14:08

Можно также использовать PostAsJsonAsync () метод, доступный в HttpClient ()

   var requestObj= JsonConvert.SerializeObject(obj);
   HttpResponseMessage response = await    client.PostAsJsonAsync($"endpoint",requestObj).ConfigureAwait(false);
0
ответ дан 31 October 2019 в 14:08

Другие вопросы по тегам:

Похожие вопросы: