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

.net, c#, httpwebrequest, json, json.net

Solution

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
}

Problem

This is my first time ever using JSON as well as `System.Net` and the `WebRequest` in any of my applications. My application is supposed to send a JSON payload, similar to the one below to an authentication server: ``` { "agent": { "name": "Agent Name", "version": 1 }, "username": "Username", "password": "User Password", "token": "xxxxxx" } ``` To create this payload, I used the `JSON.NET` library. How would I send this data to the authentication server and receive its JSON response back? Here is what I have seen in some examples, but no JSON content: ``` 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(); ``` However, this seems to be a lot of code compaired to using other languages I have used in the past. Am I doing this correctly? And how would I get the JSON response back so I can parse it? Thanks, Elite. Updated Code ``` // 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(); } } ```

Original source

Related problems