사진: Unsplash의Glenn Carstens-Peters
2023.06.24 - [CS/Go] - [Go programming] Requesting http get method to an url from an argument
[Go programming] Requesting http get method to an url from an argument
사진: Unsplash의Sergey Zolkin Today, I made a test program to get response by requesting http get method. Here's the sample code. package main import ( "fmt" "io/ioutil" "net/http" "os" ) func main() { for _, url := range os.Args[1:] { // Request http g
armin.tistory.com
안녕하세요,
이전 포스팅에서 argument를 통해 전달받은 url에 http get request를 던지고
응답을 받는 예제를 구현해 봤었습니다.
오늘은 접두사를 추가하여 해당 코드를 조금 더 개선하는 작업을 진행해 보려고 합니다.
필요한 작업은 다음과 같습니다.
1. Argument로 전달되는 URL 에 prefix를 확인 ( http:// 가 있는지 )
2. http:// 가 없는 URL을 전달받은 경우 앞에 붙인 뒤 http requst
내용은 심플 합니다.
1, 2에 해당하는 동작을 구현해 봅니다.
단순하게는 아래 코드처럼 작성해 볼 수 있을 것 같습니다.
package main
import (
"fmt"
"io"
"net/http"
"os"
)
func main() {
for _, url := range os.Args[1:] {
// Check http://
if url[0:7] != "http://" {
url = "http://" + url
}
// Request http get with given url from the first argument.
resp, err := http.Get(url)
if err != nil {
fmt.Fprintf(os.Stderr, "fetch: %v\n", err)
os.Exit(1)
}
// read body of response.
if _, err := io.Copy(os.Stdout, resp.Body); err != nil {
fmt.Printf("Error: %s", err)
}
resp.Body.Close()
if err != nil {
fmt.Fprintf(os.Stderr, "fetch: reading %s : %v\n", url, err)
os.Exit(1)
}
}
}
URL이 제대로 들어오지 않은 경우 다양한 예외들이 존재하지만
일단은 단순하게 앞에 http:// 가 있는지 정도만 확인해 보았습니다.
위 코드에서는 url [0:7]까지 string을 확인해 보고 http:// 를 체크하는 방식으로 구현을 했습니다.
(충분하지 않은 길이의 url이 들어오는 예외도 처리는 필요합니다.)
strings.HasPrefix
앞에서 구현한 코드도 사용은 가능하겠지만
strings 패키지의 HasPrefix함수를 사용해서 더 쉽게 구현해 보겠습니다.
HasPrefix 함수는 문자열이 주어진 prefix로 시작하는지 여부를 확인하는 함수입니다.
https://pkg.go.dev/strings#HasPrefix
strings package - strings - Go Packages
Title returns a copy of the string s with all Unicode letters that begin words mapped to their Unicode title case. Deprecated: The rule Title uses for word boundaries does not handle Unicode punctuation properly. Use golang.org/x/text/cases instead. packag
pkg.go.dev
코드는 다음과 같습니다.
package main
import (
"fmt"
"io"
"net/http"
"os"
"strings"
)
func main() {
for _, url := range os.Args[1:] {
// Check http://
// if url[0:7] != "http://" {
// url = "http://" + url
// }
if !strings.HasPrefix(url, "http://") {
url = "http://" + url
}
// Request http get with given url from the first argument.
resp, err := http.Get(url)
if err != nil {
fmt.Fprintf(os.Stderr, "fetch: %v\n", err)
os.Exit(1)
}
// read body of response.
if _, err := io.Copy(os.Stdout, resp.Body); err != nil {
fmt.Printf("Error: %s", err)
}
resp.Body.Close()
if err != nil {
fmt.Fprintf(os.Stderr, "fetch: reading %s : %v\n", url, err)
os.Exit(1)
}
}
}
다음과 같이 strings.HasPrefix 함수를 통해 url 내 'http://' prefix를 확인하고 없는 경우 url에 http:// 를 추가해 주고 있습니다.
if !strings.HasPrefix(url, "http://") {
url = "http://" + url
}
HasPrefix함수를 이용하여 prefix를 체크하는 경우
제가 앞에 단순하게 구현한 코드보다 구현 측면에서 편리함이 있을 것입니다.
매번 체크해야 하는 substring의 길이만큼 slicing 하는 것도 일일 될 테니까요.
또한, 입력되는 문자열의 길이를 별도로 체크하지 않아도 된다는 점이
HasPrefix의 편리함이 되지 않을까 생각됩니다.
wh.