2016-07-02 11 views
-1

はログインJSONモデル代わりに、通常のエラーのJSON要求エラーに

{ 
     "Id": <some unique Id>, 
     "Request": "Login", 
     "Params": { 
     "AuthType": "HMAC", 
     "WebApiId": <Web API Id>, 
     "WebApiKey": <Web API Key>, 
     "Timestamp": <timestamp (e.g. Date.now())>, 
     "Signature": <signature>, 
     "DeviceId": <Device Id> 
     } 
    } 

はここで常に

{ 
    "Response": "Error", 
    "Error": "Cannot parse JSON request!" 
} 
を与える私のコードですされます

通常の応答の代わりに

{ 
    "Id": <your unique Id>, 
    "Response": "Error", 
    "Error": <error description from TickTrader Server> 
} 

私のコード

private static WebSocket socket = new WebSocket("wss://cryptottlivewebapi.xbtce.net:3020"); 
     public Form1() 
     { 
      InitializeComponent(); 
     } 



     private void button1_Click(object sender, EventArgs e) 
     { 

      socket.OnMessage += Socket_OnMessage; 

      socket.OnOpen += socket_Opened; 
      socket.OnError += socket_Error; 
      socket.Connect(); 



      socket.OnClose += socket_Closed; 
     } 

     private void Socket_OnMessage(object sender, MessageEventArgs e) 
     { 
      if (e.IsText) 
      { 
       MessageBox.Show(e.Data.ToString()); 
      } 
      else 
      { 
       MessageBox.Show(e.RawData.ToString()); 
      } 
     } 



     private void socket_Closed(object sender, EventArgs e) 
     { 
      throw new NotImplementedException(); 
     } 




     private void socket_Error(object sender, ErrorEventArgs e) 
     { 
      MessageBox.Show(e.Exception.ToString()); 
     } 

     private void socket_Opened(object sender, EventArgs e) 
     { 
      string jsonSerialized = JsonConvert.SerializeObject(GetLogin()).ToString() ; 
      MessageBox.Show(jsonSerialized); 
      socket.Send(jsonSerialized); 
     } 

     LoginParams GetLogin() 
     { 
      return new LoginParams 
      { 
       Id = Guid.NewGuid().ToString(), 
       Request = "Login", 
       Params = new Parameters 
       { 
        AuthType = "HMAC", 
        WebApiId = "my id", 
        WebApiKey = "my api key", 
        Timestamp = ((Int32)(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds).ToString(), 
        Signature = Hmac.CreateToken(((Int32)(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds).ToString(), "2058e846-0a32-49b9-bc8f-4e28afd0aa9c", "my id", "my key").ToString(), 

        DeviceId = "WebBrowser" 
       } 
      }; 
     } 
     public static double DateTimeToUnixTimestamp(DateTime dateTime) 
     { 
      return (TimeZoneInfo.ConvertTimeToUtc(dateTime) - 
        new DateTime(1970, 1, 1, 0, 0, 0, 0, System.DateTimeKind.Utc)).TotalSeconds; 
     } 
    } 

public static class Hmac 
    { 
     public static string CreateToken(string timestamp, string id , string key, string secret) 
     { 
      string message = timestamp + id + key; 
      secret = secret ?? ""; 
      var encoding = new System.Text.ASCIIEncoding(); 
      byte[] keyByte = encoding.GetBytes(secret); 
      byte[] messageBytes = encoding.GetBytes(message); 
      using (var hmacsha256 = new HMACSHA256(keyByte)) 
      { 
       byte[] hashmessage = hmacsha256.ComputeHash(messageBytes); 
       return Convert.ToBase64String(hashmessage); 
      } 
     } 
    } 
    public class LoginParams 
    { 
     public string Id { get; set; } 
     public string Request { get; set; } 
     public Parameters Params { get; set; } 
    } 
    public class Parameters 
    { 
     public string AuthType { 
      get; set; } 
     public string WebApiId { get; set; } 
     public string WebApiKey { get; set; } 
     public string Timestamp { 
      get; set; } 
     public string Signature { get; set; } 
     public string DeviceId { get; set; } 

    } 

JSONシリアライズ出力

{ 
"Id": "be078b3d-2eb8-475a-97fb-89aedf775b78", 
"Request": "Login", 
"Params": { 
    "AuthType": "HMAC", 
    "WebApiId": "myid", 
    "WebApiKey": "mykey", 
    "Timestamp": "1467486605", 
    "Signature": "NbREH0HkPadfuDESuGEHho/FwX+DFdIoCV/D5aW/gv8=", 
    "DeviceId": "WebBrowser" 
} 

}最後に、タイムスタンプがすべきではないと思われる問題を発見した

+0

エラーはおそらく正確に報告されたものです:無効なJSONです。 JSONの例には実際のデータがないため、エラーの内容を特定することは不可能です。 JSONバリデータはWeb上にもアプリケーションにもありますが、多くは正確なエラーを説明し、試してみてください。 – zaph

+0

出力が有効と思われる –

+0

署名はURLセーフではありません。送信メソッドに問題がありますか? – zaph

答えて

0

事前に

感謝文字列ですが長いです

LoginParams GetLogin() 
    { 
     return new LoginParams 
     { 
      Id = Guid.NewGuid().ToString(), 
      Request = "Login", 
      Params = new Parameters 
      { 
       AuthType = "HMAC", 
       WebApiId = "my id", 
       WebApiKey = "my api key", 
       Timestamp = ((long)(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds).ToString(), 
       Signature = Hmac.CreateToken(((long)(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalMilliseconds), "2058e846-0a32-49b9-bc8f-4e28afd0aa9c", "my id", "my key").ToString(), 

       DeviceId = "WebBrowser" 
      } 
     }; 
    } 
関連する問題