Files

247 lines
5.7 KiB
Plaintext
Raw Permalink Normal View History

2022-09-12 21:56:43 +10:00
---
sidebar_position: 20
---
# Dogs API
2022-09-18 11:00:39 +10:00
```mdx-code-block
2022-09-12 21:56:43 +10:00
<div class="text--center">
<img
src={require("@site/static/img/tutorials/dogsapi/img.webp").default}
width="50%"
className="screenshot"
/>
</div>
<br />
2022-09-18 11:00:39 +10:00
```
2022-09-12 21:56:43 +10:00
2022-09-18 11:00:39 +10:00
:::note
2022-09-12 21:56:43 +10:00
2023-02-25 10:52:16 +09:00
このチュートリアルは[@tatadan](https://twitter.com/tatadan)の好意により提供されたもので、[Wails Examples Repository](https://github.com/tataDan/wails-v2-examples)の一部を構成しています。
2022-09-18 11:00:39 +10:00
:::
2023-02-25 10:52:16 +09:00
このチュートリアルでは、Web上から犬の写真を取得し、表示するアプリケーションを開発します。
2022-09-12 21:56:43 +10:00
2023-02-25 10:52:16 +09:00
### プロジェクトを作成する
2022-09-12 21:56:43 +10:00
2023-02-25 10:52:16 +09:00
では、アプリケーションを作成しましょう。ターミナルで次のコマンドを入力します: `wails init -n dogs-api -t svelte`
2022-09-12 21:56:43 +10:00
2023-02-25 10:52:16 +09:00
注: IDEサポートを追加したい場合は、オプションでこのコマンドの最後に`-ide vscode`または`ide goland`を追加することができます。
2022-09-12 21:56:43 +10:00
2023-02-25 10:52:16 +09:00
では、cd `dogs-api`をして、プロジェクトファイルの編集を始めましょう。
2022-09-12 21:56:43 +10:00
2023-02-25 10:52:16 +09:00
### 未使用のコードを削除する
2022-09-12 21:56:43 +10:00
2023-02-25 10:52:16 +09:00
まず、使用しないことがわかっているいくつかの要素を削除することから始めます:
2022-09-12 21:56:43 +10:00
2023-02-25 10:52:16 +09:00
- `app.go`を開き、以下の行を削除してください:
2022-09-12 21:56:43 +10:00
```go
// Greet returns a greeting for the given name
func (a *App) Greet(name string) string {
2022-12-30 07:38:22 +11:00
return fmt.Sprintf("Hello %s, It's show time!", name)
2022-09-12 21:56:43 +10:00
}
```
2023-02-25 10:52:16 +09:00
- `frontend/src/App.svelte`を開き、すべての行を削除します。
- `frontend/src/assets/images/logo-universal.png`ファイルを削除します。
2022-09-12 21:56:43 +10:00
2023-02-25 10:52:16 +09:00
### アプリケーションの作成
2022-09-12 21:56:43 +10:00
2023-02-25 10:52:16 +09:00
では、新しいGoのコードを追加してみましょう。
2022-09-12 21:56:43 +10:00
2023-02-25 10:52:16 +09:00
`app.go`の関数定義の前に、次の構造体宣言を追加します:
2022-09-12 21:56:43 +10:00
```go
type RandomImage struct {
2022-12-30 07:38:22 +11:00
Message string
Status string
2022-09-12 21:56:43 +10:00
}
type AllBreeds struct {
2022-12-30 07:38:22 +11:00
Message map[string]map[string][]string
Status string
2022-09-12 21:56:43 +10:00
}
type ImagesByBreed struct {
2022-12-30 07:38:22 +11:00
Message []string
Status string
2022-09-12 21:56:43 +10:00
}
```
2023-02-25 10:52:16 +09:00
以下の関数を`app.go`に追加します(既存の関数定義の後ろに追加するかもしれません):
2022-09-12 21:56:43 +10:00
```go
func (a *App) GetRandomImageUrl() string {
2022-12-30 07:38:22 +11:00
response, err := http.Get("https://dog.ceo/api/breeds/image/random")
if err != nil {
log.Fatal(err)
}
2022-09-12 21:56:43 +10:00
2022-12-30 07:38:22 +11:00
responseData, err := ioutil.ReadAll(response.Body)
if err != nil {
log.Fatal(err)
}
2022-09-12 21:56:43 +10:00
2022-12-30 07:38:22 +11:00
var data RandomImage
json.Unmarshal(responseData, &data)
2022-09-12 21:56:43 +10:00
2022-12-30 07:38:22 +11:00
return data.Message
2022-09-12 21:56:43 +10:00
}
func (a *App) GetBreedList() []string {
2022-12-30 07:38:22 +11:00
var breeds []string
2022-09-12 21:56:43 +10:00
2022-12-30 07:38:22 +11:00
response, err := http.Get("https://dog.ceo/api/breeds/list/all")
if err != nil {
log.Fatal(err)
}
2022-09-12 21:56:43 +10:00
2022-12-30 07:38:22 +11:00
responseData, err := ioutil.ReadAll(response.Body)
if err != nil {
log.Fatal(err)
}
2022-09-12 21:56:43 +10:00
2022-12-30 07:38:22 +11:00
var data AllBreeds
json.Unmarshal(responseData, &data)
2022-09-12 21:56:43 +10:00
2022-12-30 07:38:22 +11:00
for k := range data.Message {
breeds = append(breeds, k)
}
2022-09-12 21:56:43 +10:00
2022-12-30 07:38:22 +11:00
sort.Strings(breeds)
2022-09-12 21:56:43 +10:00
2022-12-30 07:38:22 +11:00
return breeds
2022-09-12 21:56:43 +10:00
}
func (a *App) GetImageUrlsByBreed(breed string) []string {
2022-12-30 07:38:22 +11:00
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)
}
2022-09-12 21:56:43 +10:00
2022-12-30 07:38:22 +11:00
responseData, err := ioutil.ReadAll(response.Body)
if err != nil {
log.Fatal(err)
}
2022-09-12 21:56:43 +10:00
2022-12-30 07:38:22 +11:00
var data ImagesByBreed
json.Unmarshal(responseData, &data)
2022-09-12 21:56:43 +10:00
2022-12-30 07:38:22 +11:00
return data.Message
2022-09-12 21:56:43 +10:00
}
```
2023-02-25 10:52:16 +09:00
`app.go`の`import`セクションを次のように変更します:
2022-09-12 21:56:43 +10:00
```go
import (
2022-12-30 07:38:22 +11:00
"context"
"fmt"
"encoding/json"
"io/ioutil"
"log"
"net/http"
"sort"
2022-09-12 21:56:43 +10:00
)
```
2023-02-25 10:52:16 +09:00
以下の行を`frontend/src/App.svelte`に追加します:
```html
2022-09-12 21:56:43 +10:00
2022-09-18 11:00:39 +10:00
<!-- prettier-ignore-start -->
2022-09-12 21:56:43 +10:00
```html
<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>
```
2022-09-18 11:00:39 +10:00
<!-- prettier-ignore-end -->
2022-09-12 21:56:43 +10:00
2023-02-25 10:52:16 +09:00
### アプリケーションのテスト
2022-09-12 21:56:43 +10:00
2023-02-25 10:52:16 +09:00
バインディングを生成し、アプリケーションをテストするには、`wails dev`を実行します。
2022-09-12 21:56:43 +10:00
2023-02-25 10:52:16 +09:00
### アプリケーションのコンパイル
2022-09-12 21:56:43 +10:00
2023-02-25 10:52:16 +09:00
アプリケーションを単一の、本番用のバイナリにコンパイルするには、`wails build`を実行します。