Я впервые использую 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();
Однако похоже, что это большой объем кода по сравнению с использованием других языков, которые я использовал в прошлом. Я правильно это делаю? И как мне вернуть ответ 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();
}
}
WebClient.UploadString(JsonConvert.SerializeObjectobj(yourobj))
илиHttpClient.PostAsJsonAsync
Ответы:
Я обнаружил, что использую библиотеку HttpClient для запросов к RESTful API, поскольку код очень простой и полностью асинхронный.
(Изменить: добавление JSON из вопроса для ясности)
{ "agent": { "name": "Agent Name", "version": 1 }, "username": "Username", "password": "User Password", "token": "xxxxxx" }
С двумя классами, представляющими опубликованную вами JSON-структуру, они могут выглядеть следующим образом:
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; } }
у вас может быть такой метод, который будет выполнять ваш запрос POST:
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 } }
источник
JsonProperty
для каждого свойства. Просто используйте Json.Net, встроенный в CamelCasePropertyNamesContractResolver, или пользовательский,NamingStrategy
чтобы настроить процесс сериализацииusing
сHttpClient
. См .: aspnetmonsters.com/2016/08/2016-08-27-httpclientwrongИспользуя пакет NuGet JSON.NET и анонимные типы, вы можете упростить то, что предлагают другие плакаты:
// ... 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); // ...
источник
Вы можете создать свою
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); } }
источник
Exception while executing function. Newtonsoft.Json: Can not add Newtonsoft.Json.Linq.JProperty to Newtonsoft.Json.Linq.JArray
ошибок?Вы также можете использовать метод PostAsJsonAsync (), доступный в HttpClient ()
источник
var obj= new Credentials { Agent = new Agent { Name = "Agent Name", Version = 1 }, Username = "Username", Password = "User Password", Token = "xxxxx" };
А затем, не преобразовывая его в httpContent, вы можете использовать PostAsJsonAsync (), передав URL-адрес конечной точки и сам преобразованный объект JSON.