URL endpoint che concatena

0

Durante la scrittura di client API, qual è il modo corretto di concatenare un URL insieme a più endpoint?

Ad esempio con l'API Blizzard:

WowEndpoints := [...]string{"achievements", "realm"}
Bliz := &Blizzard{
        Url: "https://us.api.battle.net/wow",
        Params: ReqParams,
        Client: BClient,
        Endpoints: WowEndpoints,
    }
// build the realm status request.
req, err := http.NewRequest("GET", fmt.Sprintf("%s/%s/status", Bliz.Url, Bliz.Endpoints[1]), nil)

Se guardi Bliz.Url , non vi è alcuna barra finale nell'URL di primo livello. Normalmente, aggiungo le barre quando si formattano gli endpoint dell'API come se fosse una struttura di cartelle, come puoi vedere quando eseguo l'operazione fmt.Sprintf .

Non sono sicuro di dove ho preso questa abitudine, ma volevo vedere se esisteva un metodo consigliato o preferito per creare endpoint di URL per le API.

    
posta mxplusb 09.07.2016 - 09:09
fonte

1 risposta

1

Sebbene non sia usato universalmente, il modo standard di unire un URL con un URL relativo è:

  • Se il frammento di URL contiene una parte di protocollo, sostituisce completamente l'URL originale
  • Se contiene una parte host, mantiene il protocollo dell'URL originale ma in caso contrario sostituisce tutti i componenti
  • Se inizia con una barra, mantiene il protocollo e l'host ma perde tutto il percorso
  • Se inizia con il separatore della query, '?', vengono modificate solo le parti di query e / o frammenti dell'URL
  • Se inizia con il separatore di frammenti, '#', viene modificata solo la parte frammento dell'URL
  • Altrimenti, si tratta di un percorso interpretato relativo al percorso dell'URL corrente (questo è il caso che sembra avere qui). Qualsiasi cosa dopo l'ultima barra nella parte del percorso dell'URL originale viene rimossa. Qualsiasi sequenza "../" iniziale rimuove l'ultimo componente del percorso, tornando alla barra precedente. Quindi il resto è concatenato con il risultato.

Il codice che citi non lo fa, presumibilmente perché questa complessità non è necessaria in questo caso particolare ... anche se non riconosco la lingua in cui è scritto il tuo esempio, presumerei che abbia una classe URL standard / datatype che include già questa operazione, che è ampiamente implementata nella maggior parte delle librerie standard di lingue (ad esempio in Java viene eseguita dal metodo resolve della classe URI ), e probabilmente ha è stato meglio per questa implementazione usarlo.

    
risposta data 09.07.2016 - 11:30
fonte

Leggi altre domande sui tag