LS
    
        
            API integration with Golang
            
                 16 Nov 2020, 15:21
            
                    
Hello, I wanted to know if one of you guys had an example of integration of the ctrader Open API with Golang ? I am trying to port the C# example to Go but I have some issues with that.
What I have done so far :
- generate the Protobuf go files
 - connect to the server demo API server
 - creating the ProtoMessage with a ProtoOAApplicationAuthReq payload
 
What I receive from the server :
�3FRAME_TOO_LONG"!Frame size exceeds allowed limit.
I assume it is some kind of byte conversion or websocket error but I am not sure.
Below is the code I use. I somebody could help me, I would appreciate it a lot :D Thank you in advance
func main() {
	clientID := "xxxxx"
	clientSecret := "xxxxx"
	conn, err := tls.Dial("tcp", "demo.ctraderapi.com:5035", nil)
	if err != nil {
		log.Fatal(err)
	}
	request := pb.ProtoOAApplicationAuthReq{
		ClientId:     &clientID,
		ClientSecret: &clientSecret,
	}
	bytes, _, err := toBytes(request)
	if err != nil {
		log.Fatal(err)
	}
	payloadType := uint32(pb.ProtoOAPayloadType_PROTO_OA_APPLICATION_AUTH_REQ)
	msg := pb.ProtoMessage{
		PayloadType: &payloadType,
		Payload:     bytes,
	}
	for {
		transmit(conn, msg)
		go func() {
			bytes, _, err := bufio.NewReader(conn).ReadLine()
			if err != nil && err != io.EOF {
				spew.Dump(err)
			}
			fmt.Print("Message from server: " + string(bytes) + "\n")
			spew.Dump(bytes)
		}()
		time.Sleep(time.Second)
	}
}
func transmit(conn net.Conn, msg pb.ProtoMessage) {
	bytes, length, err := toBytes(msg)
	if err != nil {
		spew.Dump(err)
	}
	conn.Write([]byte(strconv.Itoa(length)))
	conn.Write(bytes)
}
func toBytes(object interface{}) ([]byte, int, error) {
	bytes, err := json.Marshal(object)
	if err != nil {
		return nil, 0, err
	}
	fmt.Println(bytes)
	fmt.Println(len(bytes))
	return bytes, len(bytes), nil
}
