2015-05-04 2 views
2

Я пытаюсь обернуть API-интерфейс Plivo (да, я знаю, что это было сделано) с помощью RestSharp.RestSharp Serialize/Deserialize Naming Conversion

Однако, я не могу найти способ, чтобы перевести API соглашения об именовании в моей, например:

А «Call` (https://www.plivo.com/docs/api/call/#make-an-outbound-call) требует как минимум:

to, from, и answer_url быть обеспечены параметры.

Эти параметры также чувствительны к регистру.

Я хотел бы, чтобы быть в состоянии обеспечить CallRequest класса, wrappi требуемые в моих предпочтительных соглашениях об именах, а затем как-то перевести их перед сериализацией RestSharp.

Пример:

public class CallRequest 
{ 

    /// <summary> 
    /// The phone number to be used as the caller id (with the country code).For e.g, a USA caller id number could be, 15677654321, with '1' for the country code. 
    /// </summary> 
    public string From { get; set; } 

    /// <summary> 
    /// The regular number(s) or sip endpoint(s) to call. Regular number must be prefixed with country code but without the + sign). For e.g, to dial a number in the USA, the number could be, 15677654321, with '1' for the country code. Multiple numbers can be sent by using a delimiter. For e.g. 15677654321<12077657621<12047657621. Sip endpoints must be prefixed with sip: E.g., sip:[email protected] To make bulk calls, the delimiter < is used. For eg. 15677654321<15673464321<sip:[email protected] Yes, you can mix regular numbers and sip endpoints. 
    /// </summary> 
    public string To { get; set; } 

    /// <summary> 
    /// The URL invoked by Plivo when the outbound call is answered. 
    /// </summary> 
    public string AnswerUrl { get; set; } 

} 

Эти данные затем будут переведены на конвенцию Plivo в следующих функциях:

private T Execute<T>(IRestRequest request) where T : new() 
    { 
     var client = new RestClient 
     { 
      BaseUrl = new Uri(BaseUrl), 
      Authenticator = new HttpBasicAuthenticator(_accountId, _authToken), 
      UserAgent = "PlivoSharp" 
     }; 
     request.AddHeader("Content-Type", "application/json"); 
     request.AddParameter("auth_id", _accountId, ParameterType.UrlSegment); 
     request.RequestFormat = DataFormat.Json; 
     client.AddHandler("application/json", new JsonDeserializer()); 


     var response = client.Execute<T>(request); 
     if (response.ErrorException == null) return response.Data; 
     const string message = "Error retrieving response. Check inner details for more info."; 
     var plivoException = new ApplicationException(message, response.ErrorException); 
     throw plivoException; 
    } 

    public CallResponse MakeCall(CallRequest callRequest) 
    { 
     var request = new RestRequest 
     { 
      RequestFormat = DataFormat.Json, 
      Resource = "Account/{auth_id}/Call/", 
      Method = Method.POST 
     }; 

     //SOMEHOW TRANSLATE THE PROPERTIES INTO THE DATA BELOW 

     request.AddBody(new 
     { 
      to = "17#####", 
      from = "18#####", 
      answer_url = "http://m------.xml" 
     }); 

     return Execute<CallResponse>(request); 
    } 

ответ

3

К сожалению, это выглядит, как будто JSON свойство переименование не реализовано из коробки в RestSharp. У вас есть несколько вариантов:

  1. Скачать Restsharp из https://github.com/restsharp/RestSharp и восстановить его самостоятельно включить опцию компилятора SIMPLE_JSON_DATACONTRACT. Затем вы сможете переименовать свойства с использованием атрибутов контракта данных. Для получения дополнительной информации см. Здесь: RestSharp JsonDeserializer with special characters in identifiers

    Я только что перестроил последнюю версию RestSharp (версия 105.1.0) с включенной опцией. Используя следующую версию своего класса:

    [DataContract] 
    public class CallRequest 
    { 
        [DataMember(Name = "from")] 
        public string From { get; set; } 
    
        [DataMember(Name = "to")] 
        public string To { get; set; } 
    
        [DataMember(Name = "answer_url")] 
        public string AnswerUrl { get; set; } 
    } 
    

    Я был в состоянии генерировать следующий JSON:

    var request = new CallRequest { AnswerUrl = "AnswerUrl", From = "from", To = "to" }; 
        var json = SimpleJson.SerializeObject(request); 
        Debug.WriteLine(json); 
        // Prints {"from":"from","to":"to","answer_url":"AnswerUrl"} 
    

    я не уверен, насколько тщательно проверили этот вариант, однако, поскольку он составлен путем по умолчанию.

  2. Ручная сериализация и десериализация с помощью другого сериализатора, такого как Json.NET, который поддерживает переименование свойств. Для того, чтобы это сделать, см RestSharp - using the Json.net serializer (архивный here.)

+1

Вы сударь являются находкой ... Я только что провел 119 строк кода, создающего и объект с документацией: http://puu.sh/hBDpI/40f072f800. png - и затем я использовал Reflection, чтобы потом выяснить, что делать с каждым объектом. http://puu.sh/hBDrq/84ee1d8b47.png К счастью, я видел ваше сообщение, прежде чем я пошел дальше! Они обязательно должны иметь это как вариант в версии NuGet! –

+0

Я заметил, однако, что IsRequired проигнорирован, что не слишком страшно, но разочаровывает. = \ –

+0

Совершенно откровенно, это смешно. – FrankyBoy