1

Мне никогда не приходилось делать это раньше, потому что это всегда была только фактическая форма, которую я опубликовал как этот тип контента, но в последнее время мне пришлось опубликовать три переменные, подобные этому, и я прибегал к грязной конкатенации с & и =:Есть ли утилита для сериализации объекта как типа HTTP-содержимого «application/x-www-form-urlencoded»?

var content = new StringContent("grant_type=password&username=" + username + "&password=" + password.ToClearString(), Encoding.UTF8, 
    "application/x-www-form-urlencoded"); 

Я уверен, что должен быть способ, утилита, которая будет делать это, и делать это лучше, с любым необходимым кодированием. Что бы это было?

ответ

0

Используйте отражение, чтобы получить имена и значение свойств, а затем использовать их для создания System.Net.Http.FormUrlEncodedContent

public static class FormUrlEncodedContentExtension { 

    public static FormUrlEncodedContent ToFormUrlEncodedContent(this object obj) { 
     var nameValueCollection = obj.GetType() 
      .GetProperties() 
      .ToDictionary(p => p.Name, p => (p.GetValue(obj) ?? "").ToString()); 

     var content = new FormUrlEncodedContent(nameValueCollection); 

     return content; 
    } 

} 

Оттуда просто обратиться к методу расширения объекта, чтобы преобразовать его в FormUrlEncodedContent

var model = new MyModel { 
    grant_type = "...", 
    username = "...", 
    password = "..." 
}; 

var content = model.ToFormUrlEncodedContent(); 
0

Для этого вы должны использовать интерполяцию строк. Что-то вроде:

var content = new StringContent($"grant_type=password&username={username}&password={password}", Encoding.UTF8, "application/x-www-form-urlencoded"); 

Или обернуть это внутри метода хелперов/фабрик:

public static class StringContentFactory 
{ 
    public static StringContent Build(string username, string password) 
    { 
     return new StringContent($"grant_type=password&username={username}&password={password}", Encoding.UTF8, "application/x-www-form-urlencoded"); 
    } 
} 
+0

Это означает, что у меня есть знать имя каждого свойства в объекте, делая код полезным только для одного класса, и его нужно будет переписать для каждого объекта, который вы хотите сериализовать. Честно говоря, это очень плохое решение. – ProfK

+0

Извините, я неправильно понял вопрос. Я думал, что это что-то конкретное для этой части кода. Таким образом, решение на самом деле не предназначалось как универсальное, которое может обрабатывать объект с разными свойствами. – alltej

+0

Если это всего лишь один фрагмент кода, зачем писать способ его кодирования? Я мог бы просто использовать код как есть. Основным принципом методов является общность. – ProfK

1

Если это ПОКО и просто с помощью библиотеки Newtonsoft, вы можете использовать это, а также:

public static class FormUrlEncodedContentExtension 
{ 
    public static FormUrlEncodedContent ToFormUrlEncodedContent(this object obj) 
    { 
     var json = Newtonsoft.Json.JsonConvert.SerializeObject(obj); 

     var keyValues = JsonConvert.DeserializeObject<Dictionary<string, string>>(json); 

     var content = new FormUrlEncodedContent(keyValues); 

     return content; 
    } 

} 

И использование образца будет:

var myObject = new MyObject {Grant_Type = "TypeA", Username = "Hello", Password = "World"}; 

var request = new HttpRequestMessage(HttpMethod.Post, "/path/to/post/to") 
{ 
    Content = myObject.ToFormUrlEncodedContent() 
}; 
var client = new HttpClient {BaseAddress = new Uri("http://www.mywebsite.com")}; 
var response = await client.SendAsync(request); 

 Смежные вопросы

  • Нет связанных вопросов^_^