HTTP 클라이언트를 Go로 쓸 때 URL을 조립하는 방법

5404 단어 Go
이 글은 Go2 Advent Calendar 2017의 열흘째 기사다.
외부 API용 HTTP 클라이언트/HTTP 요청이 적혀 있으며 URL의 조립 방법에 세부 사항이 있습니다.

견본

  • yyoshiki41/go-instagram-profile
  • 주제 전에 인스타그램에서.
    https://www.instagram.com/natgeo/?__a=1
    이렇게 사용자의 프로필 정보json가 회답하는 단점.
    # example
    $ curl "https://www.instagram.com/natgeo/?__a=1" | jq .user.biography
    "Experience the world through the eyes of National Geographic photographers."
    
    (문서에 기록되지 않아 변경이 있을 수 있지만 인스타그램 앱 로그인도 필요 없어 알아두기 편해요!)

    URL 조립 방법


    다음은 본론.
    HTTP 클라이언트 쓰기
    url := fmt.Sprintf("%s/%s", endpoint, username)
    
    url := endpoint + "/" + username
    
    이런 코드로 아래의 오류를 몇 번이나 눈치채지 못해 시간이 걸렸다.
  • "오류가 답장될 줄 알았는데https://api.instagram.com/v1/username 누락/변했다https://api.instagram.com/v1username.
  • "어, 구성된 URL 호스트 이름에/가 있습니다.
      https://www.instagram.com/ or https://www.instagram.com
  • 표준 포장으로 간편하게


    표준 포장을 통일하여 쓰다.
    var endpoint = "https://www.instagram.com"
    
    // endpoint のスキームでミスがあったら、ここでチェックできる。
    u, err := url.Parse(endpoint)
    if err != nil {
        return err
    }
    
    // 複数のエンドポイントもこの書き方で統一して、 `/` の処理を任せる。
    u.Path = path.Join(u.Path, username)
    
    // 元のURLにクエリパラメータがついていた場合の上書きを防げる。
    q := u.Query()
    q.Set("__a", "1")
    u.RawQuery = q.Encode()
    
    req, err := http.Get(u.String())
    ...
    
    간혹path/filepath 사용된 물건을 보고 다시 파악path하고 path/filepath포장의 사용법이 다르면 좋겠다.path 포장의 분배가 전부이지만 당분간은 말하지 않겠다.
    Package path implements utility routines for manipulating slash-separated paths.
    The path package should only be used for paths separated by forward slashes, such as the paths in URLs. This package does not deal with Windows paths with drive letters or backslashes; to manipulate operating system paths, use the path/filepath package.
    ref.
    - golang.org/pkg/path/
    - Golang 대신 path 를 사용하여 물리적 파일을 조작하면 폭발합니다.
    또한 여러 외부 API용 HTTP 클라이언트가 기록되어 있습니다.
  • yyoshiki41/go-pushwoosh
  • yyoshiki41/go-radiko
  • Go의 API 클라이언트 설치 모드 등
    공개된 포장은 오피셜/unofficial을 포함해 여러 가지가 있다고 생각해요. 몇 개 볼 수 있어요!

    좋은 웹페이지 즐겨찾기