質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.04%

この記述の内容を教えてください。

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 903

ibabababa

score 11

サーバサイド言語はまるで素人なため、ポインタなどの概念が未だうまく捕らえられていません。
加えて、フロントサイドで使わないような複雑な型変換などが多く、つまずいています。

type Items struct {
    Title      string `json:"title"`
    Content    string `json:"content"`
    Status     string `json:"status"`
    Categories [1]int `json:"categories"`
}
title := "title"
content := "<div>content</div>"
status := "publish"
categories := [1]int{1}

items := Items{Title: title, Content: content, Status: status, Categories: categories}
json, err := json.Marshal(&items)
if err != nil {
 fmt.Print("json parce error")
}
body := []byte(json)

// Post
req, err := http.NewRequest(
    "POST",
    API_URL,
    bytes.NewBuffer(data),
)
if err != nil {
    fmt.Println("url scarapping failed")
}

// Content-Type 設定
req.Header.Set("Content-Type", "application/json")
req.SetBasicAuth(USER, PASS)

client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
    fmt.Println(err)
}
fmt.Println(resp)
defer resp.Body.Close()

構造体作って、jsonにして、とか全体の流れはわかるのですが、
json.Marshal(&items)
[]byte(json)
bytes.NewBuffer(body)
は何のためにしているのかなどがよくわかりません。

ご教授お願いします。

------ 追記 -------
全行です↓

package main

import (
    "bytes"
    "encoding/json"
    "fmt"
    "net/http"
)

type Items struct {
    Title      string `json:"title"`
    Content    string `json:"content"`
    Status     string `json:"status"`
    Categories [1]int `json:"categories"`
}

func main() {
    const URL = "https://example.com/wp-json/wp/v2/posts/"
    const USER = "ユーザ"
    const PASS = "パス"
    items := Items{Title: "title from api2", Content: "content from api", Status: "publish", Categories: [1]int{1}}

    json, err := json.Marshal(&items)
    if err != nil {
        fmt.Print("json parce error")
    }
    data := []byte(json)

    // Post
    req, err := http.NewRequest(
        "POST",
        URL,
        bytes.NewBuffer(data),
    )
    if err != nil {
        fmt.Println("url scarapping failed")
    }

    // Content-Type 設定
    req.Header.Set("Content-Type", "application/json")
    req.SetBasicAuth(USER, PASS)
    client := &http.Client{}
    resp, err := client.Do(req)
    if err != nil {
        fmt.Println(err)
    }
    fmt.Println(resp)
    defer resp.Body.Close()
}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • dyoshikawa

    2019/01/03 18:45

    何をしたい処理ですか?
    data := bytes.NewBuffer(body)
    のdataは何に使うんでしょうか?
    その後のコードもないので判断できません。
    目的がわからないと、何のためにしている処理か答えようがないです。

    キャンセル

  • ibabababa

    2019/01/03 18:49

    修正依頼ありがとうございます。
    追記いたしました。

    キャンセル

  • dyoshikawa

    2019/01/03 18:59

    まず、下記の部分コンパイル通りますか?

    req, err := http.NewRequest(
    "POST",
    API_URL,
    bytes.NewBuffer(data),
    )

    NewRequestの第三引数の型が違うような気がするんですが。
    API_URLも中身定義されてないように思うのですが未定義エラー出ないでしょうか?

    キャンセル

  • ibabababa

    2019/01/03 19:08

    書き方が悪かったです。

    > NewRequestの第三引数の型が違うような気がするんですが。
    現状の型はどうなっているのか。望ましい型を教えていただけるとありがたいです。
    コンパイルエラーは出ません。

    > API_URLも中身定義されてないように思う
    色々端折っちゃったので、全行載せますね。

    キャンセル

回答 1

checkベストアンサー

0

json.Marshal(&items)

まず、下記の部分コンパイル通りますか?

すみません。
これは私の誤解でした。
*Buffer型で良いようです。

json.Marshal(&items)

Goの構造体をJSONに準ずる文字列に変換する処理です。
返却は文字列型でなくバイト型ですが。

[]byte(json)

json を[]byte型にキャストします。
ただすでに json は[]byte型のはずなのでこの処理は不要かと。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/01/03 19:31

    途中で投稿してしまったのでここに続けます。

    bytes.NewBuffer(body)

    []byte型から*buffer型を返す処理です。

    キャンセル

  • 2019/01/03 20:16

    回答ありがとうございます!
    だいぶスッキリしました。

    json.Marshalの引数が&itemsとポインタ変数になっていますが、これをitemsとして実行したところ、問題なく通りました。

    json.Marshalの引数はアドレスでもその値でも関係ないのでしょうか?
    &itemsとitemsとの違いがありましたら教えていただきたいです。

    キャンセル

  • 2019/01/03 20:47

    Marshalの引数の型はinterfaceです。どんな型でもコンパイルが通ります。
    Goは静的型付け言語としては緩い部類なのでinterface型引数が頻繁に出てきます。
    私は試してないですがitemsでも&itemsでも意図通り動作するならどちらでも良いように作ってあるということでしょう。

    キャンセル

  • 2019/01/03 21:31

    ありがとうございます!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.04%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる