2017-07-06 1 views
0

Je reçois des données de l'API Vault Hashicorp, et la difficulté à le manipuler parce que j'ai une compréhension floue des interfaces encore :(Traitement des données d'interface à l'aide mapstructure

Je reçois une réponse TLS cert depuis le serveur PKI . l'utilisation de go-dumper, il affiche ceci:.

(0xc4203880c0) &Secret { 
    RequestID: "271c63ef-d7b6-a084-18a0-966dd6989f03", 
    LeaseID: "", 
    LeaseDuration: 0 (int), 
    Renewable: false, 
    Data: map[string]interface {} { 
    "serial_number": interface() , 
    "ca_chain": interface() , 
    "certificate": interface() , 
    "issuing_ca": interface() , 
    "private_key": interface() , 
    "private_key_type": interface() 
    }, 
    Warnings: nil ([]string), 
    Auth: nil (*api.SecretAuth), 
    WrapInfo: nil (*api.SecretWrapInfo) 
} 

ce que je voudrais faire est d'imprimer le champ "certficate" à l'aide fmt donc je l'ai fait:

créé un struct:

type TLSCredentialResp struct { 
    IssuingCA string `mapstructure:"issuing_ca"` 
    PrivateKey string `mapstructure:"private_key"` 
    CAChain string `mapstructure:"ca_chain"` 
    Cert  string `mapstructure:"certificate"` 
} 

puis utilisé mapstructure pour décoder en elle:

var response TLSCredentialResp 
if err := mapstructure.Decode(docker.Data, &response); err != nil { 
    log.Fatal("Error parsing vault's credential response: ", err) 
} 

fmt.Printf("Private Key: %s", response.PrivateKey) 

Cependant, lorsque je tente, je reçois le texte suivant:

Error parsing vault's credential response: 1 error(s) decoding: 
* 'ca_chain' expected type 'string', got unconvertible type '[]interface {}' 
exit status 1 

Maintenant, il est assez clair pour moi que j'ai J'ai mal compris, car j'essaye de décoder une interface en chaîne. Ce qui n'est pas clair pour moi, c'est comment je fais affaire avec interface() en tant que type? En termes simples, comment puis-je obtenir la valeur du certificat en texte brut?

+0

Avez-vous mess avec la sortie de go-dumper ? Il montre 'interface()' comme un type mais ce n'est pas une chose. 'interface {}' est un type. De plus, votre erreur indique que ca-chain est une [[] interface {} '(tranche d'interface vide). La première chose à faire est de déterminer quels sont les types sous-jacents (['fmt.Printf ("% T ")' peut être utile] (https://play.golang.org/p/Z3NNC0B0U0)), puis passer de Là. – Adrian

+0

Non, jamais vu auparavant, mais c'est définitivement 'interface()' – jaxxstorm

Répondre

0

Donc, je suis un idiot, c'était beaucoup plus facile que ce à quoi je m'attendais.

Je ne ai pas besoin d'utiliser mapstructure il semble, je peux le faire:

fmt.Printf("Private Key: %s", docker.Data["private_key"]) 
fmt.Printf("Cert: %s", docker.Data["certificate"]) 

Bien que je ne sais pas pourquoi ..