I parametri statici in un'API dovrebbero far parte di ciascun metodo?

2

Attualmente sto creando una libreria che è un wrapper per un'API online. L'ovvio obiettivo è quello di renderlo facile da usare per gli altri il più possibile. Come tale sto cercando di determinare l'approccio migliore quando si tratta di parametri comuni per l'API.

Nella mia situazione attuale ci sono 3 (chiave del consumatore, segreto del consumatore e gettone di autorizzazione). Sono essenzialmente necessari in ogni chiamata API. La mia domanda è se dovessi rendere questi 3 parametri richiesti per ogni metodo o c'è un modo migliore.

Vedo le mie opzioni attuali come:

  1. Posiziona i parametri in ogni chiamata di metodo

    public ApiObject callMethod(String consumerKey, String consumerSecret, String token, ...)
    

    Questo sembra ragionevole, ma mi sembra terribilmente ripetitivo.

  2. Creare una classe singleton che l'utente deve inizializzare prima di chiamare qualsiasi metodo API. Questo sembra sbagliato e in pratica li limiterebbe ad accedere a un account alla volta tramite l'API (che potrebbe essere ragionevole, non lo so).

  3. Falli posizionarli in un file di proprietà nel loro progetto. In questo modo posso caricare le proprietà in quel modo e memorizzarle. Questo mi sembra simile al singleton, ma non dovrebbero chiamare esplicitamente qualcosa per inizializzare questi valori.

C'è un'altra opzione che non vedo, o una pratica più comune in questa situazione che dovrei seguire?

    
posta Jacob Schoen 31.10.2012 - 02:41
fonte

4 risposte

2

Penso che ciò che Telastyn sta suggerendo sia

public class ConsumerContext { string key; string secret; string token; }
public ApiObject callMethod(ConsumerContext, ...)

Questo è a volte un modo per fornire anche le informazioni locali - aggiungerlo al contesto.

    
risposta data 31.10.2012 - 02:57
fonte
7

Nessuna delle precedenti!

Come parte dell'API hai un contesto o una connessione o qualsiasi cosa sia più appropriata. Chiedi al consumatore di specificare questi token durante la costruzione, quindi le chiamate al metodo sono metodi di istanza nel contesto.

    
risposta data 31.10.2012 - 02:46
fonte
1

Questo è semplicemente per dimostrare con la formattazione di ciò che penso che Telastyn stava descrivendo ...

public class ConsumerContext 
(
  prop string key
  prop string secret
  prop string token

  # default ctor
  public ConsumerContext(){}

  # parameterized ctor
  public ConsumerContext(string key, string secret, string token)
  {
     this.key = key
     this.secret = secret
     this.token = token
  }

  public void FooWrapper(fooApiSpecificParamList)
  {
     api.foo(this.key, this.secret, this.token, fooApiSpecificParamList)
  }

  public void BarWrapper(barApiSpecificParamList)
  {
     api.bar(this.key, this.secret, this.token, barApiSpecificParamList)
  }

}
    
risposta data 31.10.2012 - 04:31
fonte
0

Posso vedere due modi:

  • riunisce tutti i parametri in un singolo oggetto di contesto, sul lato client API. Ogni volta che chiami la tua API, passa l'oggetto contesto come parametro.
  • usa un oggetto contesto simile, ma memorizzalo sul lato API. Assegna al client un token che identifica l'oggetto del contesto e chiedi al client API di passarlo ogni volta che chiama l'API. Ciò è utile se non puoi inviare facilmente oggetti all'API (ad esempio API HTTP)
risposta data 25.06.2015 - 23:54
fonte

Leggi altre domande sui tag