Golang 데이터 커넥터 2부

24520 단어 go

소개





소규모 데이터 수집기를 시작했습니다. 아이디어는 Ghost 블로그에서 다른 것으로 데이터를 이동하려는 것입니다. 이번에는 API 호출에서 반환되는 데이터를 실제로 사용하도록 시작점을 확장할 것입니다. 즉, 들어오는 데이터를 자세히 살펴봐야 한다는 의미입니다... 이를 염두에 두고 시작하겠습니다.

구조 추가



현재 데이터를 수신하고 []byte에서 string로 변환하여 화면에 인쇄할 수 있습니다. 멋지고 전부지만 그다지 유용하지는 않습니다. 대신 데이터를 구문 분석하고 이 프로젝트의 다음 단계에서 사용할 수 있도록 만들 수 있는지 확인해야 합니다.

이렇게 하려면 JSON을 struct로 변환해야 합니다. 좋아요, 어떻게 하죠? 몇 가지 다른 방법이 있지만 내가 찾은 가장 쉬운 방법은 사이트JSON to Go를 사용하는 것입니다. 이 사이트는 JSON 개체를 일치하는 Golangstruct으로 변환합니다.


https://demo.ghost.io/ghost/api/v4/content/posts/?key=22444f78447824223cefc48062에 대한 호출의 원시 출력을 양식에 간단히 붙여넣을 수 있습니다. 그것은 우리가 필요로 하는 정확한 struct 것을 내뱉을 것입니다:

type AutoGenerated struct {
    Posts []struct {
        ID string `json:"id"`
        UUID string `json:"uuid"`
        Title string `json:"title"`
        Slug string `json:"slug"`
        HTML string `json:"html"`
        CommentID string `json:"comment_id"`
        FeatureImage string `json:"feature_image"`
        Featured bool `json:"featured"`
        Visibility string `json:"visibility"`
        CreatedAt time.Time `json:"created_at"`
        UpdatedAt time.Time `json:"updated_at"`
        PublishedAt time.Time `json:"published_at"`
        CustomExcerpt string `json:"custom_excerpt"`
        CodeinjectionHead interface{} `json:"codeinjection_head"`
        CodeinjectionFoot interface{} `json:"codeinjection_foot"`
        CustomTemplate interface{} `json:"custom_template"`
        CanonicalURL interface{} `json:"canonical_url"`
        EmailRecipientFilter string `json:"email_recipient_filter"`
        URL string `json:"url"`
        Excerpt string `json:"excerpt"`
        ReadingTime int `json:"reading_time"`
        Access bool `json:"access"`
        OgImage interface{} `json:"og_image"`
        OgTitle interface{} `json:"og_title"`
        OgDescription interface{} `json:"og_description"`
        TwitterImage interface{} `json:"twitter_image"`
        TwitterTitle interface{} `json:"twitter_title"`
        TwitterDescription interface{} `json:"twitter_description"`
        MetaTitle interface{} `json:"meta_title"`
        MetaDescription interface{} `json:"meta_description"`
        EmailSubject interface{} `json:"email_subject"`
        Frontmatter interface{} `json:"frontmatter"`
        Plaintext string `json:"plaintext,omitempty"`
    } `json:"posts"`
    Meta struct {
        Pagination struct {
            Page int `json:"page"`
            Limit int `json:"limit"`
            Pages int `json:"pages"`
            Total int `json:"total"`
            Next interface{} `json:"next"`
            Prev interface{} `json:"prev"`
        } `json:"pagination"`
    } `json:"meta"`
}


AutoGeneratedGhost로 업데이트하여 시작하겠습니다. 여기에서 전체 struct를 이전 코드의 맨 위에 추가할 수 있습니다. 바로 위 main() 입니다. 그것은 우리가 방금 추가하려는 경우입니다. 상상한 수신 시스템에서는 전체struct가 필요하지 않으므로 약간 생략했습니다. 또한 값이 설정되면 실제로 얻게 되는 값이기 때문에 여러 항목interface{}을 문자열로 업데이트했습니다.

package main

import (
    "encoding/json"
    "fmt"
    "io"
    "log"
    "net/http"
    "time"
)

type Ghost struct {
    Posts []struct {
        ID string `json:"id"`
        UUID string `json:"uuid"`
        Title string `json:"title"`
        Slug string `json:"slug"`
        HTML string `json:"html"`
        FeatureImage string `json:"feature_image"`
        Featured bool `json:"featured"`
        Visibility string `json:"visibility"`
        CreatedAt time.Time `json:"created_at"`
        UpdatedAt time.Time `json:"updated_at"`
        PublishedAt time.Time `json:"published_at"`
        CustomExcerpt string `json:"custom_excerpt"`
        URL string `json:"url"`
        Excerpt string `json:"excerpt"`
        ReadingTime int `json:"reading_time"`
        Access bool `json:"access"`
        OgImage string `json:"og_image"`
        OgTitle string `json:"og_title"`
        OgDescription string `json:"og_description"`
        TwitterImage string `json:"twitter_image"`
        TwitterTitle string `json:"twitter_title"`
        TwitterDescription string `json:"twitter_description"`
        MetaTitle string `json:"meta_title"`
        MetaDescription string `json:"meta_description"`
        Plaintext string `json:"plaintext,omitempty"`
    } `json:"posts"`
    Meta struct {
        Pagination struct {
            Page int `json:"page"`
            Limit int `json:"limit"`
            Pages int `json:"pages"`
            Total int `json:"total"`
            Next interface{} `json:"next"`
            Prev interface{} `json:"prev"`
        } `json:"pagination"`
    } `json:"meta"`
}

func main() {

    ...snip...






이 게시물을 즐기십니까?


How about buying me a coffee?



더 많은 인쇄



좋아, 우리는 천천히 어딘가에 도착하고 있습니다! 이제 우리는 fmt.Println()를 코드로 대체하여 struct를 실제로 사용할 것입니다. 지난번과 같은 방법으로 본문을 읽어보겠습니다.

    body, err := io.ReadAll(resp.Body)
    if err != nil {
        log.Fatal(err)
    }



그러나 이번에는 인쇄하는 대신 p 유형의 변수 Ghost를 만듭니다. p를 사용하여 받은 본체를 json.Unmarshal 사용합니다.

    var p Ghost
    err = json.Unmarshal(body, &p)
    if err != nil {
        log.Fatal(err)
    }



이제 여기에서 range 전체에 걸쳐 p.Posts에 액세스할 수 있으며 다시 한 번 화면에 인쇄합니다.

    for i := range p.Posts {
        fmt.Printf("%v", p.Posts[i])
    }



다음번



이것이 이 빠른 게시물의 전부입니다. 아래에서 전체 코드 목록을 볼 수 있습니다. 다음에 우리는 한 단계 더 나아가 실제로 http 패키지를 사용하여 게시물을 다른 서비스로 보낼 것입니다.

코드 목록




package main

import (
    "encoding/json"
    "fmt"
    "io"
    "log"
    "net/http"
    "time"
)

type Ghost struct {
    Posts []struct {
        ID string `json:"id"`
        UUID string `json:"uuid"`
        Title string `json:"title"`
        Slug string `json:"slug"`
        HTML string `json:"html"`
        FeatureImage string `json:"feature_image"`
        Featured bool `json:"featured"`
        Visibility string `json:"visibility"`
        CreatedAt time.Time `json:"created_at"`
        UpdatedAt time.Time `json:"updated_at"`
        PublishedAt time.Time `json:"published_at"`
        CustomExcerpt string `json:"custom_excerpt"`
        URL string `json:"url"`
        Excerpt string `json:"excerpt"`
        ReadingTime int `json:"reading_time"`
        Access bool `json:"access"`
        OgImage string `json:"og_image"`
        OgTitle string `json:"og_title"`
        OgDescription string `json:"og_description"`
        TwitterImage string `json:"twitter_image"`
        TwitterTitle string `json:"twitter_title"`
        TwitterDescription string `json:"twitter_description"`
        MetaTitle string `json:"meta_title"`
        MetaDescription string `json:"meta_description"`
        Plaintext string `json:"plaintext,omitempty"`
    } `json:"posts"`
    Meta struct {
        Pagination struct {
            Page int `json:"page"`
            Limit int `json:"limit"`
            Pages int `json:"pages"`
            Total int `json:"total"`
            Next interface{} `json:"next"`
            Prev interface{} `json:"prev"`
        } `json:"pagination"`
    } `json:"meta"`
}

func main() {
    req, err := http.NewRequest(http.MethodGet, "https://demo.ghost.io/ghost/api/v4/content/posts/?key=22444f78447824223cefc48062", nil)
    if err != nil {
        log.Fatal(err)
    }

    resp, err := http.DefaultClient.Do(req)
    if err != nil {
        log.Fatal(err)
    }

    defer resp.Body.Close()

    body, err := io.ReadAll(resp.Body)
    if err != nil {
        log.Fatal(err)
    }

    var p Ghost
    err = json.Unmarshal(body, &p)
    if err != nil {
        log.Fatal(err)
    }

    for i := range p.Posts {
        fmt.Printf("%v", p.Posts[i])
    }
}

좋은 웹페이지 즐겨찾기