試みを知っている試み


ゲット、忘れましょう


これまでのところ、リモートの残りのAPIからデータを要求する方法については、いくつかの例がありました.今回は、リモートエンドポイントにデータを送信する方法を検討します.あなたはおそらく何かを使用することができます go-swagger このようにすべてを行うと、おそらく生産の設定で行うと述べた.しかし、学習目的のために、私たちは標準ライブラリを使用することによって何をすることができるか、標準ライブラリを使用して書いた小さなパッケージに取り組むつもりです.
今回はメールガンAPIを使ってメールを送ってみます.私は比較的簡単で、メールガンを選びますwell documented - そして、私はすでにアカウントを持っています.あなたが従っているならば、あなたshould sign-up .

ゴパス


でもまず!私は、それがあなたが走っているOSに応じて少し怪しいことができるので、本当にGopathに入らないことを望んでいました.それを念頭においてwiki カバーの詳細の詳細とちょうどそれに触れるだけで可能な限り.ほとんどの場合、私はあなたがこれを読んでいるかどうかを仮定している可能性が既にインストールし、行く準備ができている.私は将来的なポストでうまくいけばいくつかの再利用可能なパッケージを一緒に準備を開始したいと思ったので、このプロジェクトを少し違うようにしようとしました.これを念頭に、我々は非常に単純な“送信のみ”メールガンクライアントを書くつもりです.私の最初のステップは私のgopathのディレクトリを作成することでした/Users/steve/Code/go ) インマイgithub.com/shindakun ディレクトリ.多分、私はそれを直接に入れなければならなかったでしょうATLG それが結局そこに終わるので、レポ.またはGOモジュールに変換します.私は後で、それらのディレクトリを作りましょう.
mkdir $GOTPATH/github.com/shindakun/mailgunner
mkdir $GOTPATH/github.com/shindakun/mailgunner/client
まず「クライアント」のコードをカバーします.我々がちょうど標準的なライブラリでできるだけ同じようにしようとしていることを覚えておいてください.クライアントディレクトリでmain.go ファイルを起動してパッケージを設定します.
クイック脇-私はVSCodems-vscode.go プラグイン.かどうか-どのようなエディタを使用して快適な.
package client

import (
  "net/http"
  "net/url"
  "strings"
)
あまりにも多くの部品を移動することはありません.strings and net/url 私たちのデータを要求に追加する準備ができてnet/http 実際にHTTPリクエストを入れます.
インポートは、途中で、私は次の部分を行う見ることができるいくつかの方法があります.しかし、私はここに提示されたものが最も意味をなすと思います-少なくとも私の心で.まず、構造体を宣言するMgClient , この構造体はAPI URLを持ち、APIトークンと http.Client .NewMgClient() API URLとトークンを受け取り、structを返します.このセットアップでは、別のメールガンアカウントで複数のプロジェクトでパッケージを使用することができます、我々はちょうど必要に応じてそれを渡すことができます.
type MgClient struct {
  MgAPIURL string
  MgAPIKey string
  Client   *http.Client
}

func NewMgClient(apiurl, apikey string) MgClient {
  return MgClient{
    apiurl,
    apikey,
    http.DefaultClient,
  }
}
クライアントパッケージの本当の重いリフティングは、次のFormatEmailRequest() . の方法ですMgClient それで、それはリターンからの呼び出し元に渡されますNewMgClient() - 後でそれを見ましょう.ここでいくつかの異なったことがありますので、私は、各々をカバーするために半分に機能を分割しました(完全なコードリストは、Githubの上で、または、向こうにあります).The data オブジェクトの使用url.Values{} 我々が最終的にフォーム服従であることのために我々のキー値組をまとめることを許します.関数を呼び出すとき、変数の値をすべて渡します.
func (mgc *MgClient) FormatEmailRequest(from, to, subject, body string) (r *http.Request, err error) {
  data := url.Values{}
  data.Add("from", from)
  data.Add("to", to)
  data.Add("subject", subject)
  data.Add("text", body)
私たちの電子メールの詳細を途中で、我々はHTTPリクエストを構築する必要があります.これは以前行ったことと似ています.ただし、使用していることに注意してくださいhttp.MethodPost ではなくhttp.MethodGet . 加えて、我々はstrings.NewReader() 作成するio.Reader その中で我々はdata.Encode() . .Encode() 単にURL encodes 私たちのキー値のペアは、我々は何かを取得しますto=emailaddress&from=someotheraddress など.そして、Basic Authorization headerContent-Type header . この場合の形式はJSONではなく、URLエンコード形式です.
  r, err = http.NewRequest(http.MethodPost, mgc.MgAPIURL+"/messages", strings.NewReader(data.Encode()))
  if err != nil {
    return nil, err
  }
  r.SetBasicAuth("api", mgc.MgAPIKey)
  r.Header.Add("Content-Type", "application/x-www-form-urlencoded")
  return r, nil
}
そしてそれは“クライアント”パッケージについてです!単純な権利?私は、我々がテストまたは2を加える若干の将来のポストで、このコードに戻るようにしようとします.あなたは、私たちが私たちが2009年から戻ることを確認することによって、すでにそれについて考え始めたのを見ることができますFormatEmailRequest() 何かがうまくいかないなら、エラーで.ここで考えているのは、パッケージ内でエラーを起こしたいのですが、パッケージを使っている人が誰でも選択できるように処理することができます.

マイナー


今、我々はメインに戻るmailgunner ディレクトリと新規作成main.go ファイル.私たちの輸入品はきれいで清潔ですfmt and io/ioutil , 標準ライブラリから加えて、我々の新しいclient パッケージともう一つ.私は簡潔な言及をした envy 私のパッケージでは、環境変数を取得したりエラーを返したりする非常に小さなモジュールです.env変数を使用するには良い方法ですkeep API keys out of Git repos . “羨望”のためのコードを簡単に含めることができます(これはすべての後にのみ5行)が、これはすべてのビットクリーナーを保つと思います.むしろそれ以上の書き込みは、それ自身のパッケージになります.下記参照envy.Get() からのメールガンAPIキーを取得するために使用されますMGKEY 環境変数.
package main

import (
  "fmt"
  "io/ioutil"

  "github.com/shindakun/envy"
  "github.com/shindakun/mailgunner/client"
)

func main() {
  mgKey, err := envy.Get("MGKEY")
  if err != nil {
    panic(err)
  }
途中で基本的なセットアップで、我々は良いものになるつもりです.まず、私たちは新しいMgClient{} そして、mgc . 私たちはmgc.FormatEmailRequest() 我々のテストメッセージで.また、コードのAPI URLをenv変数に移動したり、const 閉じるこの動画はお気に入りから削除されています.
  mgc := client.NewMgClient("https://api.mailgun.net/v3/youremaildomain.com",
    mgKey)

  req, err := mgc.FormatEmailRequest("<Name> [email protected]",
    "[email protected]", "Test email", "This is a test email!")
  if err != nil {
    panic(err)
  }
ここからコードは、ほとんどの部分の前の例に似ています.我々は実際の要求をするmgc.Client.Do() , 読み込む[]byte からのデータres.Body , そして最後に文字列と印字に変換します.
  res, err := mgc.Client.Do(req)
  if err != nil {
    panic(err)
  }
  defer res.Body.Close()

  body, err := ioutil.ReadAll(res.Body)
  if err != nil {
    panic(err)
  }

  fmt.Println(string(body))
}
そして、すべてが言われて、されるとき、我々の出力はこのように見えなければなりません.
$ MGKEY=key-key go run main.go
{
  "id": "<[email protected]>",
  "message": "Queued. Thank you."
}

次回


我々は、我々が配置していた部分で何かをすることに近づいています-全くなく、しかし、近い.次に、リモートのエンドポイントからユーザーのリストのリストをプルダウンするためにAPI“getter”を変更します.一度ユーザーには、短い旅行の場所には、電子メールを送信する場所にコードを取得する必要があります.
これのためにコードを見つけることができます、そして、他のほとんどはGithubの上でRepoでGoポストを学ぶことを試みます.

新田勲 / アトランティス


ソースレポのための“試みを試みて”私はDED . TOに上に準備してきた投稿


試みを試み


ここで、私は私が私が書いていて、転がっているGo柱を学ぶことを試みているために、書いていたコードを見つけることができます.

ポストインデックス


ポスト
コード
-
-
-
-
-
src
src
src
src
src
src
src
src
src
src
src
src
src
src
src
上記参照
View on GitHub
このポストをお楽しみください.
How about buying me a coffee?