狗狗 API

备注
本教程由 @tatadan 友情提供,是他们的 Wails Examples Repository 的一部分。
在本教程中,我们将开发一个应用程序,从网络上检索狗的照片,然后显示它们。
创建项目
让我们创建应用程序。 从终端输入:wails init -n dogs-api -t svelte
注意:如果您想添加 IDE 支持,我们可以选择在此命令的末尾添加 -ide vscode 或 -ide goland。
现在让我们 cd dogs-api 开始编辑项目文件。
删除未使用的代码
我们将从删除一些我们知道不会使用的元素开始:
- 打开 
app.go并删除以下行: 
// Greet returns a greeting for the given name
func (a *App) Greet(name string) string {
    return fmt.Sprintf("Hello %s, It's show time!", name)
}
- 打开 
frontend/src/App.svelte并删除所有行。 - 删除 
frontend/src/assets/images/logo-universal.png文件 
创建应用程序
现在让我们添加新的 Go 代码。
在函数定义之前添加以下结构声明到 app.go:
type RandomImage struct {
    Message string
    Status  string
}
type AllBreeds struct {
    Message map[string]map[string][]string
    Status  string
}
type ImagesByBreed struct {
    Message []string
    Status  string
}
将以下函数添加到 app.go(可能在现有函数定义之后):
func (a *App) GetRandomImageUrl() string {
    response, err := http.Get("https://dog.ceo/api/breeds/image/random")
    if err != nil {
        log.Fatal(err)
    }
    responseData, err := ioutil.ReadAll(response.Body)
    if err != nil {
        log.Fatal(err)
    }
    var data RandomImage
    json.Unmarshal(responseData, &data)
    return data.Message
}
func (a *App) GetBreedList() []string {
    var breeds []string
    response, err := http.Get("https://dog.ceo/api/breeds/list/all")
    if err != nil {
        log.Fatal(err)
    }
    responseData, err := ioutil.ReadAll(response.Body)
    if err != nil {
        log.Fatal(err)
    }
    var data AllBreeds
    json.Unmarshal(responseData, &data)
    for k := range data.Message {
        breeds = append(breeds, k)
    }
    sort.Strings(breeds)
    return breeds
}
func (a *App) GetImageUrlsByBreed(breed string) []string {
    url := fmt.Sprintf("%s%s%s%s", "https://dog.ceo/api/", "breed/", breed, "/images")
    response, err := http.Get(url)
    if err != nil {
        log.Fatal(err)
    }
    responseData, err := ioutil.ReadAll(response.Body)
    if err != nil {
        log.Fatal(err)
    }
    var data ImagesByBreed
    json.Unmarshal(responseData, &data)
    return data.Message
}
将 app.go 的 import 部分修改为如下所示:
import (
    "context"
    "fmt"
    "encoding/json"
    "io/ioutil"
    "log"
    "net/http"
    "sort"
)
将以下行添加到 frontend/src/App.svelte:
<script>
  import { GetRandomImageUrl } from "../wailsjs/go/main/App.js";
  import { GetBreedList } from "../wailsjs/go/main/App.js";
  import { GetImageUrlsByBreed } from "../wailsjs/go/main/App.js";
  let randomImageUrl = "";
  let breeds = [];
  let photos = [];
  let selectedBreed;
  let showRandomPhoto = false;
  let showBreedPhotos = false;
  function init() {
    getBreedList();
  }
  init();
  function getRandomImageUrl() {
    showRandomPhoto = false;
    showBreedPhotos = false;
    GetRandomImageUrl().then((result) => (randomImageUrl = result));
    showRandomPhoto = true;
  }
  function getBreedList() {
    GetBreedList().then((result) => (breeds = result));
  }
  function getImageUrlsByBreed() {
    init();
    showRandomPhoto = false;
    showBreedPhotos = false;
    GetImageUrlsByBreed(selectedBreed).then((result) => (photos = result));
    showBreedPhotos = true;
  }
</script>
<h3>Dogs API</h3>
<div>
  <button class="btn" on:click={getRandomImageUrl}>
    Fetch a dog randomly
  </button>
  Click on down arrow to select a breed
  <select bind:value={selectedBreed}>
    {#each breeds as breed}
      <option value={breed}>
        {breed}
      </option>
    {/each}
  </select>
  <button class="btn" on:click={getImageUrlsByBreed}>
    Fetch by this breed
  </button>
</div>
<br />
{#if showRandomPhoto}
  <img id="random-photo" src={randomImageUrl} alt="No dog found" />
{/if}
{#if showBreedPhotos}
  {#each photos as photo}
    <img id="breed-photos" src={photo} alt="No dog found" />
  {/each}
{/if}
<style>
  #random-photo {
    width: 600px;
    height: auto;
  }
  #breed-photos {
    width: 300px;
    height: auto;
  }
  .btn:focus {
    border-width: 3px;
  }
</style>
创建应用程序
要生成绑定并测试应用程序,请运行 wails dev。
编译应用程序
要将应用程序编译为单个可用于生产的二进制文件,请运行 wails build。