Ana içeriğe geç

JSON gönderin ve alın

Bu eğitimde, JSON mesajlarını nasıl gönderip alabileceğinizi açıklıyoruz.

TCP ve WebSocket

JSON ile çalışırken, bir TCP bağlantısı veya bir WebSocket bağlantısı kullanabilirsiniz.

JSON gönderin

Entegrasyonunuzda JSON kullanmayı seçerseniz, cTrader arka ucuna geçerli JSON içeren dizeler göndermeniz gerekecektir. Bu dizeler olarak iletilen JSON nesneleri aşağıdaki anahtarları içermelidir.

Anahtar Değer veri türü Tanım
"clientMsgId" dize Bir mesajın benzersiz kimliği. Bu kimlik istemci tarafında oluşturulmalı ve atanmalıdır.
"payloadType" tam sayı Mesajı temsil eden tam sayı. Geçerli yük türlerinin tam listesi ProtoOAPayloadType içinde yer almaktadır.
"payload" JSON nesnesi Mesajın gerçek içeriğini içeren iç içe bir JSON nesnesi.

Geçerli bir dizenin ( ProtoOAApplicationAuthReq mesajını temsil eden) bir örneği aşağıda bulunabilir.

"{"clientMsgId": "cm_id_2", "payloadType": 2100, "payload": {"clientId": "34Rsd_T098asHkl","clientSecret": "validClientSecret"}}"

Doğru JSON dizeleri göndermek için, seçtiğiniz programlama dilinde serileştirme için özel bir mekanizma oluşturmanız gerekecektir.

Aşağıdaki örneklerde, serileştirmeyi ele almak için çeşitli yaklaşımlar tanımlıyoruz. Tercih ettiğiniz programlama diline ve tasarım desenlerine bağlı olarak kendi uygulamanızı yapabilirsiniz (ve yapmalısınız).

Aşağıda, iki temel sınıf tanımlıyoruz ve ardından ProtoOAApplicationAuthReq mesajının özel bir temsilini oluşturuyoruz.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public abstract class OpenAPIMessageBase
{
    public string ClientMsgId { get; set; }
    public abstract int PayloadType { get; }
}

public abstract class OpenAPIMessagePayloadBase { }

public class ApplicationAuthReq : OpenAPIMessageBase
{
    public ApplicationAuthReq() { }
    public ApplicationAuthReq(string clientId, string clientSecret)
    {
        this.Payload = new ApplicationAuthReqPayload(clientId, clientSecret);
        this.ClientMsgId = Guid.NewGuid().ToString();
    }

    public override int PayloadType => 2100;
    public ApplicationAuthReqPayload? Payload { get; set; }

}

public class ApplicationAuthReqPayload : OpenAPIMessagePayloadBase
{
    public ApplicationAuthReqPayload() { }
    public ApplicationAuthReqPayload(string clientId, string clientSecret)
    {
        this.ClientId = clientId;
        this.ClientSecret = clientSecret;
    }
    public string ClientId { get; set; } = string.Empty;
    public string ClientSecret { get; set; } = string.Empty;
}

Tüm Open API mesajları için bir temel sınıf oluşturuyoruz ve gösterim amacıyla ProtoOAApplicationAuthReq sınıfını tanımlıyoruz.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import uuid
import json

class OpenAPIMessage:

def payloadType(self):
    pass

def payload(self):
    pass

def clientMsgId(self):
    pass

def asJsonString(self):
    pass


class ApplicationAuthReq(OpenAPIMessage):

def __init__(self, clientId, clientSecret, clientMsgId = str(uuid.uuid4())):
    self.clientId = clientId
    self.clientSecret = client_secret
    self.payloadType = 2100
    self.clientMsgId = clientMsgId
    self.payload = {"clientId": self.clientId, "clientSecret": self.clientSecret}



def asJsonString(self):
    return json.dumps({"clientMsgId": self.clientMsgId, "payloadType": self.payloadType, "payload": self.payload})

Gerekli mantığı uyguladıktan sonra, bu mesajları temsil eden sınıfların yeni örneklerini oluşturarak ve ardından bunları tercih ettiğiniz TCP veya WebSocket istemcisine ileterek cTrader arka ucuna yeni mesajlar gönderebilmelisiniz.

Receive JSON

JSON mesajlarını almak ve işlemek için, bir JSON dizesini bir Open API mesajının gösterimine seri durumdan çıkarmak için bir yöntem uygulamanız gerekir.

Bu yöntemi uygulamak için, yük türlerinin, mesajları temsil eden sınıfların adlarıyla anahtar olabileceği bir eşlem (veya sözlük) başlatmanız faydalı olabilir. İstisna işleme amaçları için, aldığınız mesajın yük türünün bu eşlemde veya sözlükte bir anahtar olup olmadığını doğrulamanız gerekebilir. Böyle bir anahtar varsa, mesajı uygun herhangi bir mantık kullanarak seri durumdan çıkarabilirsiniz.

Böyle bir yöntem uyguladıktan sonra, her yeni mesaj aldığınızda tetiklenen bir geri arama olarak kullanabilirsiniz.

Aşağıdaki örnekte TMessage'ın genel bir tür olduğunu unutmayın.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
public static class MessageReceivedCallbacks
{
    public static Dictionary<int, Type> messages = new Dictionary<int, Type>
    {
        {2100, typeof(ApplicationAuthReq) },

    };

    public static TMessage ReadMessage<TMessage>(string jsonString) where TMessage : OpenAPIMessageBase
    {
        JsonDocument doc = JsonDocument.Parse(jsonString);
        int payloadType = doc.RootElement.GetProperty("payloadType").GetInt32();

        if (!messages.TryGetValue(payloadType, out var type))
            throw new Exception("This payload type is not supported");

        var result = JsonSerializer.Deserialize(jsonString, type)  as TMessage;

        return result;
    }
}

Alt Tür Dönüşümü

ReadMessage() yöntemi aslında belirli bir mesaj sınıfı döndürmez; bir mesaj alırken alt tür dönüşümünü ayrı olarak ele almanız gerekecektir.

ApplicationAuthReq sınıfımıza aşağıdaki yöntemi ekliyoruz.

1
2
3
@staticmethod
def fromJson(jsonDct):
    return ApplicationAuthReq(clientId=jsonDct['payload']['clientId'], clientSecret=jsonDct['payload']['clientSecret'], clientMsgId=jsonDct['clientMsgId'])

Ardından readMessage geri aramamızı ekliyor ve bir sözlükten bir yük alıyoruz.

1
2
3
4
5
6
7
8
9
class MessageReceivedCallbacks:

messagesDict = {2100: ApplicationAuthReq}

@staticmethod
def readMessage(jsonString):
    json_dct = json.loads(jsonString)
    payloadType = jsonDct['payloadType']
    return MessageReceivedCallbacks.messagesDict[payloadType].fromJson(jsonDct)

Alt Tür Dönüşümü

Python ördek tipli olduğundan, alt tür dönüşümünü ayrı olarak ele almaya gerek yoktur. JSON dizesini alırken gerekli türe seri durumdan çıkarabilirsiniz.