2015-08-12 12 views
0

Этот код является образцом тела ответа от api.Отверстите тело ответа от web api

message_type=incoming&mobile_number=639181234567&shortcode=2929&request_id=5048303030534D415254303030303032393230303032303030303030303133323030303036333933393932333934303030303030313331313035303735383137&message=This+is+a+test+message&timestamp=1383609498.44 

Есть ли способ разместить тело ответа на свойства объекта, подобного этому? Или что-то вроде десериализации тела ответа?

public class SampleApi 
{ 
    public string MessageId { get; set; } 

    public string MessageType { get; set; } 

    public string MobileNumber { get; set; } 

    public string Message { get; set; } 

    public string ShortCode { get; set; } 

    public string ClientId { get; set; } 

    public string SecretKey { get; set; } 

    //Start From Reply Api 

    public string RequestId { get; set; } 
} 
+0

ли это Chikka случайно? Если это похоже на то, что тело запроса отформатировано таким образом, а не тело ответа (они кажутся JSON), и если это так, вы, вероятно, более заинтересованы в сериализации вашего пользовательского объекта в тело запроса, которое десериализует его из ответа ... нет? –

+0

Да этот ответ от Chikka Api, В частности, форма Chikka получает Api. Я получу этот ответ, тогда я буду использовать ответ от Eer для десериализации его. – janmvtrinidad

ответ

1

Вы можете написать собственный десериализатор Из-за этого

public T Deserialize<T>(string resp) where T : new() 
{ 
    var nameValuePairs = HttpUtility.ParseQueryString(resp); 
    var obj = new T(); 
    var props = obj.GetType().GetProperties() 
        .ToDictionary(p => p.Name.Replace("_","") , p => p, StringComparer.InvariantCultureIgnoreCase); 
    foreach(var key in nameValuePairs.AllKeys) 
    { 
     var newkey = key.Replace("_", ""); 
     if (props.ContainsKey(newkey)) 
      props[newkey].SetValue(obj, Convert.ChangeType(nameValuePairs[key], props[newkey].PropertyType)); 
    } 
    return obj; 
} 

и использовать в качестве

string response = "message_type=incoming&mobile_number=639181234567&shortcode=2929&request_id=5048303030534D415254303030303032393230303032303030303030303133323030303036333933393932333934303030303030313331313035303735383137&message=This+is+a+test+message&timestamp=1383609498.44"; 
var sampleApi = Deserialize<SampleApi>(response); 
+0

У вас есть хорошая попытка для этого, спасибо Eser! – janmvtrinidad

+0

Я добавил null для третьего параметра, такого как этот реквизит [newkey] .SetValue (obj, Convert.ChangeType (nameValuePairs [key], props [newkey] .PropertyType), null); ', чтобы заставить его работать. в любом случае спасибо снова! – janmvtrinidad

1

Это формат пользовательских сообщений (не XML или JSON), поэтому единственным способом было бы разделить строку на «&», а затем разделить каждую пару имя/значение на «=» и отобразить его к вашим свойствам класса.

+0

Итак, если нет библиотеки для обработки этого формата, я думаю, я сделаю, как вы сказали, спасибо! – janmvtrinidad

1

в контроллере вы можете использовать свой тип непосредственно

ActionResult YourApiAction(SampleApi sampleApi) 
    { 
     var allMapped = sampleApi.MappMessage(); 
     ....allMapped.MessageType... 
    } 

но имена в сообщении должно быть таким же именем, как и в youy типа. message_type -> должен быть MessageType и так далее. Затем волшебство сериализует ваше сообщение прямо в вашем типе.

мой комментарий:

class SampleApi 
{ 
    string message_type { get; set; } 
    string MessageType { get; private set } 

    SampleApi MappMessage() 
    { 
     MessageType = message_type; 
     return this; 
    } 
} 
+0

Да, это тоже хорошая идея, но другой api, который вызывает мой api, поступает из разных источников, поэтому я не могу изменить его из message_type -> MessageType. Но если у вас есть идея поместить аннотацию данных в свойствах в класс для сопоставления ответа (что-то вроде этого: [MapResponse = "message_type"] public string MessageType {get; set;} '), это будет хорошая идея. – janmvtrinidad

+0

переименуйте свойства в своем классе SampleApi.message_type. Или добавьте в имена классов имена Propertie. затем напишите метод getMessage, в котором вы используете свойства сообщения для своих имен Propertytie. – tire0011

+0

Это также хорошая идея (даже если она не выглядит хорошо в представлении редактора), и я могу использовать ее и для другой ситуации. Благодаря! – janmvtrinidad

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