Send JSON via Post in C# and Receive the JSON Returned

Send JSON via POST in C# and Receive the JSON returned?

I found myself using the HttpClient library to query RESTful APIs as the code is very straightforward and fully async'ed. To send this JSON payload:

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

With two classes representing the JSON structure you posted that may look like this:

public class Credentials
{
public Agent Agent { get; set; }

public string Username { get; set; }

public string Password { get; set; }

public string Token { get; set; }
}

public class Agent
{
public string Name { get; set; }

public int Version { get; set; }
}

You could have a method like this, which would do your POST request:

var payload = new Credentials { 
Agent = new Agent {
Name = "Agent Name",
Version = 1
},
Username = "Username",
Password = "User Password",
Token = "xxxxx"
};

// Serialize our concrete class into a JSON String
var stringPayload = JsonConvert.SerializeObject(payload);

// Wrap our JSON inside a StringContent which then can be used by the HttpClient class
var httpContent = new StringContent(stringPayload, Encoding.UTF8, "application/json");

var httpClient = new HttpClient()

// Do the actual request and await the response
var httpResponse = await httpClient.PostAsync("http://localhost/api/path", httpContent);

// If the response contains content we want to read it!
if (httpResponse.Content != null) {
var responseContent = await httpResponse.Content.ReadAsStringAsync();

// From here on you could deserialize the ResponseContent back again to a concrete C# type using Json.Net
}

preparing Json Object for HttpClient Post method

You need to either manually serialize the object first using JsonConvert.SerializeObject

var values = new Dictionary<string, string> 
{
{"type", "a"}, {"card", "2"}
};
var json = JsonConvert.SerializeObject(values);
var data = new StringContent(json, Encoding.UTF8, "application/json");

//...code removed for brevity

Or depending on your platform, use the PostAsJsonAsync extension method on HttpClient.

var values = new Dictionary<string, string> 
{
{"type", "a"}, {"card", "2"}
};
var client = new HttpClient();
using(var response = client.PostAsJsonAsync(myUrl, values).Result) {
result = response.Content.ReadAsStringAsync().Result;
}

Send JSON data in http post request C#

try this

using (var client = new HttpClient())
{
var contentType = new MediaTypeWithQualityHeaderValue("application/json");
var baseAddress = "https://....";
var api = "/controller/action";
client.BaseAddress = new Uri(baseAddress);
client.DefaultRequestHeaders.Accept.Add(contentType);

var data = new Dictionary<string,string>
{
{"id","72832"},
{"name","John"}
};

var jsonData = JsonConvert.SerializeObject(data);
var contentData = new StringContent(jsonData, Encoding.UTF8, "application/json");

var response = await client.PostAsync(api, contentData);

if (response.IsSuccessStatusCode)
{
var stringData = await response.Content.ReadAsStringAsync();
var result = JsonConvert.DeserializeObject<object>(stringData);
}
}

Update

If the request comes back with Json data in the form `

 { "return":"8.00", "name":"John" }

you have to create result model

public class ResultModel
{
public string Name {get; set;}
public double Return {get; set;}
}

and code will be

if (response.IsSuccessStatusCode)
{
var stringData = await response.Content.ReadAsStringAsync();
var result = JsonConvert.DeserializeObject<ResultModel>(stringData);

var value=result.Return;
var name=Result.Name;

}

Send JSON via POST in C# and Use LINQ to access Objects

You go to http://quicktype.io (or similar online service, jsonutils, json2csharp, or use the Visual studio Paste Json as Classes feature - of all the sites that do this QT is the most full featured) to turn your json into classes. This makes it nicer to work with:

// <auto-generated />
//
// To parse this JSON data, add NuGet 'Newtonsoft.Json' then do:
//
// using SomeNamespaceHere;
//
// var rootClassNameHere = RootClassNameHere.FromJson(jsonString);

namespace SomeNamespaceHere
{
using System;
using System.Collections.Generic;

using System.Globalization;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;

public partial class RootClassNameHere
{
[JsonProperty("@odata.context")]
public Uri OdataContext { get; set; }

[JsonProperty("value")]
public Value[] Value { get; set; }
}

public partial class Value
{
[JsonProperty("emailAddress")]
public EmailAddress EmailAddress { get; set; }

[JsonProperty("automaticReplies")]
public AutomaticReplies AutomaticReplies { get; set; }
}

public partial class AutomaticReplies
{
[JsonProperty("message")]
public string Message { get; set; }

[JsonProperty("messageLanguage")]
public MessageLanguage MessageLanguage { get; set; }

[JsonProperty("scheduledStartTime")]
public ScheduledTime ScheduledStartTime { get; set; }

[JsonProperty("scheduledEndTime")]
public ScheduledTime ScheduledEndTime { get; set; }
}

public partial class MessageLanguage
{
[JsonProperty("locale")]
public string Locale { get; set; }

[JsonProperty("displayName")]
public string DisplayName { get; set; }
}

public partial class ScheduledTime
{
[JsonProperty("dateTime")]
public string DateTime { get; set; }

[JsonProperty("timeZone")]
public string TimeZone { get; set; }
}

public partial class EmailAddress
{
[JsonProperty("name")]
public string Name { get; set; }

[JsonProperty("address")]
public string Address { get; set; }
}

public partial class RootClassNameHere
{
public static RootClassNameHere FromJson(string json) => JsonConvert.DeserializeObject<RootClassNameHere>(json, SomeNamespaceHere.Converter.Settings);
}

public static class Serialize
{
public static string ToJson(this RootClassNameHere self) => JsonConvert.SerializeObject(self, SomeNamespaceHere.Converter.Settings);
}

internal static class Converter
{
public static readonly JsonSerializerSettings Settings = new JsonSerializerSettings
{
MetadataPropertyHandling = MetadataPropertyHandling.Ignore,
DateParseHandling = DateParseHandling.None,
Converters =
{
new IsoDateTimeConverter { DateTimeStyles = DateTimeStyles.AssumeUniversal }
},
};
}
}

(I chose "SomeNamespaceHere" and "RootClassNameHere" for the relevant names of namespace and class root; you might choose different)

And then you use it like this (the deser step will work differently depending on the service you used):

var rootClassNameHere = RootClassNameHere.FromJson(jsonString); //deser
var someLinq = rootClassNameHere.Value.Select(v => v.AutomaticReplies.Message); //query

Receiving JSON data back from HTTP request

If you are referring to the System.Net.HttpClient in .NET 4.5, you can get the content returned by GetAsync using the HttpResponseMessage.Content property as an HttpContent-derived object. You can then read the contents to a string using the HttpContent.ReadAsStringAsync method or as a stream using the ReadAsStreamAsync method.

The HttpClient class documentation includes this example:

  HttpClient client = new HttpClient();
HttpResponseMessage response = await client.GetAsync("http://www.contoso.com/");
response.EnsureSuccessStatusCode();
string responseBody = await response.Content.ReadAsStringAsync();

How to post JSON to a server using C#?

The way I do it and is working is:

var httpWebRequest = (HttpWebRequest)WebRequest.Create("http://url");
httpWebRequest.ContentType = "application/json";
httpWebRequest.Method = "POST";

using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
{
string json = "{\"user\":\"test\"," +
"\"password\":\"bla\"}";

streamWriter.Write(json);
}

var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
{
var result = streamReader.ReadToEnd();
}

I wrote a library to perform this task in a simpler way, it is here: https://github.com/ademargomes/JsonRequest

Send a json on a post request with HttpClient and C#

It looks like you want to post a json in the request. Try to define the right content-type that is application/json. For sample:

request.Content = new StringContent("{\"priority\" : \"High\"}",
Encoding.UTF8,
"application/json");

Since your method returns a string it can be a a non-async method. The method SendAsync is async and you have to wait the request finished. You could try to call Result after the request. For sample:

var response =  httpClient.SendAsync(request).Result;
return response.Content; // string content

And you will get an object of HttpResponseMessage. There are a lot of useful information about the response on it.

POSTing JsonObject With HttpClient From Web API

With the new version of HttpClient and without the WebApi package it would be:

var content = new StringContent(jsonObject.ToString(), Encoding.UTF8, "application/json");
var result = client.PostAsync(url, content).Result;

Or if you want it async:

var result = await client.PostAsync(url, content);


Related Topics



Leave a reply



Submit