web-dev-qa-db-ger.com

Senden Sie JSON über POST in C # und erhalten Sie das zurückgegebene JSON?

Dies ist das erste Mal, dass ich JSON oder sogar den Teil System.Net Und WebRequest in einer meiner Anwendungen verwende. Meine Anwendung soll eine JSON-Nutzlast an einen Authentifizierungsserver senden, ähnlich der folgenden:

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

Um diese Nutzdaten zu erstellen, habe ich die Bibliothek JSON.NET Verwendet. Wie würde ich diese Daten an den Authentifizierungsserver senden und seine JSON-Antwort zurückerhalten? Folgendes habe ich in einigen Beispielen gesehen, aber keinen JSON-Inhalt:

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();

Dies scheint jedoch ein großer Unterschied zu anderen Sprachen zu sein, die ich in der Vergangenheit verwendet habe. Mache ich das richtig? Und wie würde ich die JSON-Antwort zurückbekommen, damit ich sie analysieren kann?

Danke, Elite.

aktualisierter 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();
    }
}
60
Hunter Mitchell

Ich habe festgestellt, dass ich die Bibliothek HttpClient zum Abfragen von RESTful-APIs verwendet habe, da der Code sehr einfach und vollständig asynchron ist.

(Edit: Hinzufügen von JSON aus Frage zur Klarheit)

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

Mit zwei Klassen, die die von Ihnen gepostete JSON-Struktur darstellen, sieht das möglicherweise so aus:

public class Credentials
{
    [JsonProperty("agent")]
    public Agent Agent { get; set; }

    [JsonProperty("username")]
    public string Username { get; set; }

    [JsonProperty("password")]
    public string Password { get; set; }

    [JsonProperty("token")]
    public string Token { get; set; }
}

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

    [JsonProperty("version")]
    public int Version { get; set; }
}

sie könnten eine Methode wie diese haben, die Ihre POST Anfrage ausführen würde:

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 = await Task.Run(() => 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");

using (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
    }
}
92
Kai Eichinger

Sie können Ihr HttpContent mit der Kombination von JObject zu vermeiden und JProperty erstellen und dann ToString() aufrufen, wenn Sie das StringContent erstellen. :

        /*{
          "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
Jan Dolejsi

Mit dem JSON.NET NuGet-Paket und anonymen Typen können Sie die Vorschläge der anderen Poster vereinfachen:

// ...

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

Sie können auch die in HttpClient () verfügbare PostAsJsonAsync () -Methode verwenden.

   var requestObj= JsonConvert.SerializeObject(obj);
   HttpResponseMessage response = await    client.PostAsJsonAsync($"endpoint",requestObj).ConfigureAwait(false);