发送 head 请求
/**
发送head请求
**/
package main
import (
"fmt"
"net/http"
"os"
)
func main() {
if len(os.Args) != 2 {
fmt.Println("Usage: ", os.Args[0], "url")
os.Exit(1)
}
url := os.Args[1]
response, err := http.Head(url)
checkError(err)
fmt.Println(response.Status)
// 获取返回的response中的头域
for k, v := range response.Header {
fmt.Println(k + ": ", v)
}
os.Exit(0)
}
func checkError(err error) {
if err != nil {
fmt.Println("Fatal error", err.Error())
os.Exit(1)
}
}
发送 get 请求
/**
发送get请求
**/
package main
import (
"fmt"
"net/http"
"net/http/httputil"
"os"
"strings"
)
func main() {
if len(os.Args) != 2 {
fmt.Println("Usage: ", os.Args[0], "url")
os.Exit(1)
}
url := os.Args[1]
// 发送 get 请求
response, err := http.Get(url)
checkError(err)
if response.Status != "200 OK" {
fmt.Println(response.Status)
os.Exit(2)
}
// 分析结构体指针是否正确 如果正确 返回utf8格式
s, err := httputil.DumpResponse(response,true)
checkError(err)
fmt.Println(string(s))
contentTypes := response.Header["Content-Type"]
fmt.Println(fmt.Sprintf("%T", contentTypes)) // []string
fmt.Println(contentTypes)
if !acceptableCharset(contentTypes) {
fmt.Println("Cannot handle", contentTypes)
os.Exit(4)
}
// 获取 body 内容
var buf[512]byte
reader := response.Body
for {
n, err := reader.Read(buf[0:])
checkError(err)
fmt.Print(string(buf[0:n]))
}
os.Exit(0)
}
func acceptableCharset(contentTypes []string) bool {
// each type is like [text/html; charset=UTF-8]
// we want the UTF-8 only
for _, cType := range contentTypes {
// 字符串查找
if strings.Index(cType, "UTF-8") != -1 {
return true
}
}
return false
}
func checkError(err error) {
if err != nil {
fmt.Println("Fatal error", err.Error())
os.Exit(1)
}
}
使用 net/http 中的 http.Client 发送 get 请求
/**
使用 net/http 中的 http.Client 发送 get 请求
**/
package main
import (
"fmt"
"net/http"
"net/url"
"os"
"strings"
)
func main() {
if len(os.Args) != 2 {
fmt.Println("Usage: ", os.Args[0], "url")
os.Exit(1)
}
url := os.Args[1]
get(url)
os.Exit(0)
}
func get(uri string) {
url, err := url.Parse(uri)
checkError(err)
// 获取 http.Client 对象
client := &http.Client{}
// 获取 http.Request 对象
request, err := http.NewRequest("GET", url.String(), nil)
checkError(err)
// 增加请求头
request.Header.Add("Accept-Charset", "UTF-8;q=1, ISO-8859-1;q=0")
// 发送请求
response, err := client.Do(request)
if response.Status != "200 OK" {
fmt.Println(response.Status)
os.Exit(2)
}
// 获取字符集
chSet := getCharset(response)
fmt.Printf("got charset %s\n", chSet)
if chSet != "UTF-8" {
fmt.Println("Cannot handle", chSet)
os.Exit(4)
}
// 读取body内容
var buf[512]byte
reader := response.Body
fmt.Println("got body")
for {
n, err := reader.Read(buf[0:])
if err != nil {
os.Exit(0)
}
fmt.Print(string(buf[0:n]))
}
}
func getCharset(response *http.Response) string {
contentType := response.Header.Get("Content-Type")
if contentType == "" {
return "UTF-8"
}
idx := strings.Index(contentType, "charset:")
if idx == -1 {
return "UTF-8"
}
// 去掉字符串中首部以及尾部中的 " "
return strings.Trim(contentType[idx:], " ")
}
func checkError(err error) {
if err != nil {
fmt.Println("Fatal error", err.Error())
os.Exit(1)
}
}
proxy get
/**
proxy get
**/
package main
import (
"fmt"
"io"
"net/http"
"net/http/httputil"
"net/url"
"os"
)
func main() {
if len(os.Args) != 3 {
fmt.Println("Usage: ", os.Args[0], "http://proxy-host:port http://host:port/path")
os.Exit(1)
}
// 获取 proxy url
proxyString := os.Args[1]
// url.Parse 会检查 url 是否合法
proxyURL, err := url.Parse(proxyString)
checkError(err)
// 获取目标 url
rawURL := os.Args[2]
url, err := url.Parse(rawURL)
checkError(err)
transport := &http.Transport{Proxy: http.ProxyURL(proxyURL)}
client := &http.Client{Transport: transport}
// client := &http.Client{}
request, err := http.NewRequest("GET", url.String(), nil)
// 分析结构体指针是否正确 如果正确 返回utf8格式
dump, err := httputil.DumpRequest(request, false)
checkError(err)
fmt.Println(string(dump))
// 发送请求
response, err := client.Do(request)
checkError(err)
fmt.Println("Read ok")
if response.Status != "200 OK" {
fmt.Println(response.Status)
os.Exit(2)
}
fmt.Println("Response ok")
// 读取body内容
var buf[512]byte
reader := response.Body
fmt.Println("got body")
for {
n, err := reader.Read(buf[0:])
if err != nil {
os.Exit(0)
}
fmt.Print(string(buf[0:n]))
}
os.Exit(0)
}
func checkError(err error) {
if err != nil {
if err == io.EOF {
return
}
fmt.Println("Fatal error", err.Error())
os.Exit(1)
}
}
proxy auth get
/**
proxy auth get
**/
package main
import (
"encoding/base64"
"fmt"
"io"
"net/http"
"net/http/httputil"
"net/url"
"os"
)
const auth = "jannewmarch:mypassword"
func main() {
if len(os.Args) != 3 {
fmt.Println("Usage: ", os.Args[0], "http://proxy-host:port http://host:port/path")
os.Exit(1)
}
// 获取 proxy url
proxyString := os.Args[1]
// url.Parse 会检查 url 是否合法
proxyURL, err := url.Parse(proxyString)
checkError(err)
// 获取目标 url
rawURL := os.Args[2]
url, err := url.Parse(rawURL)
checkError(err)
// encode the auth
basic := "Basic " + base64.StdEncoding.EncodeToString([]byte(auth))
transport := &http.Transport{Proxy: http.ProxyURL(proxyURL)}
client := &http.Client{Transport: transport}
// client := &http.Client{}
request, err := http.NewRequest("GET", url.String(), nil)
request.Header.Add("Proxy-Authorization", basic)
// 分析结构体指针是否正确 如果正确 返回utf8格式
dump, err := httputil.DumpRequest(request, false)
checkError(err)
fmt.Println(string(dump))
// 发送请求
response, err := client.Do(request)
checkError(err)
fmt.Println("Read ok")
if response.Status != "200 OK" {
fmt.Println(response.Status)
os.Exit(2)
}
fmt.Println("Response ok")
// 读取body内容
var buf[512]byte
reader := response.Body
fmt.Println("got body")
for {
n, err := reader.Read(buf[0:])
if err != nil {
os.Exit(0)
}
fmt.Print(string(buf[0:n]))
}
os.Exit(0)
}
func checkError(err error) {
if err != nil {
if err == io.EOF {
return
}
fmt.Println("Fatal error", err.Error())
os.Exit(1)
}
}