Skip to content

Commit 239968f

Browse files
committed
分离API请求版本
1 parent 4d641c1 commit 239968f

File tree

7 files changed

+154
-101
lines changed

7 files changed

+154
-101
lines changed

api_ping.go

+47
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package seafile
2+
3+
import (
4+
"fmt"
5+
"io/ioutil"
6+
"net/http"
7+
)
8+
9+
//测试Seafile服务连通性
10+
func (cli *Client) Ping() error {
11+
resp, err := http.Get(cli.Addr + "/api2/ping")
12+
if err != nil {
13+
return fmt.Errorf("请求错误:%s", err)
14+
}
15+
defer resp.Body.Close()
16+
17+
b, err := ioutil.ReadAll(resp.Body)
18+
if err != nil {
19+
return fmt.Errorf("读取错误:%s", err)
20+
}
21+
22+
if string(b) == `"pong"` {
23+
return nil
24+
}
25+
26+
return fmt.Errorf("未知返回:%s", err)
27+
}
28+
29+
//自动添加Token后执行请求
30+
func (cli *Client) AuthPing() error {
31+
resp, err := cli.doRequest("GET", "/auth/ping/", nil, nil)
32+
if err != nil {
33+
return fmt.Errorf("请求错误:%s", err)
34+
}
35+
defer resp.Body.Close()
36+
37+
b, err := ioutil.ReadAll(resp.Body)
38+
if err != nil {
39+
return fmt.Errorf("读取错误:%s %s", resp.Status, err)
40+
}
41+
42+
if string(b) == `"pong"` {
43+
return nil
44+
}
45+
46+
return fmt.Errorf("未知返回:%s", err)
47+
}

api_token.go

+47
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package seafile
2+
3+
import (
4+
"encoding/json"
5+
"fmt"
6+
"io/ioutil"
7+
"net/http"
8+
"net/url"
9+
)
10+
11+
//获取AuthToken
12+
func (cli *Client) Auth(username, password string) error {
13+
formData := url.Values{
14+
"username": {username},
15+
"password": {password},
16+
}
17+
18+
resp, err := http.PostForm(cli.Addr+"/api2/auth-token/", formData)
19+
if err != nil {
20+
return fmt.Errorf("请求错误:%s", err)
21+
}
22+
defer resp.Body.Close()
23+
24+
b, err := ioutil.ReadAll(resp.Body)
25+
if err != nil {
26+
return fmt.Errorf("读取错误:%s %s", resp.Status, err)
27+
}
28+
29+
if resp.StatusCode != http.StatusOK {
30+
return fmt.Errorf("%s %s", resp.Status, string(b))
31+
}
32+
33+
//TODO: 找到真正的返回结构
34+
respInfo := map[string]string{}
35+
err = json.Unmarshal(b, &respInfo)
36+
if err != nil {
37+
return fmt.Errorf("读取错误:%s", err)
38+
}
39+
40+
cli.authToken = respInfo["token"]
41+
42+
if respInfo["token"] == "" {
43+
return fmt.Errorf("%s", string(b))
44+
}
45+
46+
return nil
47+
}

api_v2.go

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package seafile
2+
3+
import (
4+
"io"
5+
"net/http"
6+
)
7+
8+
func (cli *Client) doRequest(method, uri string, header http.Header, body io.Reader) (*http.Response, error) {
9+
return cli.requestApi("/api2", method, uri, header, body)
10+
}

api_v2p1.go

+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package seafile
2+
3+
import (
4+
"io"
5+
"net/http"
6+
)
7+
8+
func (cli *Client) apiRequestV2p1(method, uri string, header http.Header, body io.Reader) (*http.Response, error) {
9+
return cli.requestApi("/api/v2.1", method, uri, header, body)
10+
}
11+
12+
func (cli *Client) apiGET(uri string) (*http.Response, error) {
13+
return cli.apiRequestV2p1("GET", uri, nil, nil)
14+
}
15+
16+
func (cli *Client) apiPOST(uri string, header http.Header, body io.Reader) (*http.Response, error) {
17+
return cli.apiRequestV2p1("POST", uri, header, body)
18+
}
19+
20+
func (cli *Client) apiPUT(uri string, header http.Header, body io.Reader) (*http.Response, error) {
21+
return cli.apiRequestV2p1("PUT", uri, header, body)
22+
}
23+
24+
func (cli *Client) apiDELETE(uri string, header http.Header, body io.Reader) (*http.Response, error) {
25+
return cli.apiRequestV2p1("DELETE", uri, header, body)
26+
}

client.go

+16-89
Original file line numberDiff line numberDiff line change
@@ -1,115 +1,58 @@
11
package seafile
22

33
import (
4-
"encoding/json"
54
"fmt"
65
"io"
7-
"io/ioutil"
86
"net/http"
9-
"net/url"
107
"strings"
118
)
129

1310
//Seafile客户端
1411
type Client struct {
15-
Hostname string
12+
Addr string
1613
authToken string
1714
}
1815

19-
const apiPrefix = "/api2"
20-
2116
//新建一个Seafile客户端
2217
//三种用法:
23-
// cli := New(hostname) //未认证的客户端,需要手动调用cli.Auth(user,pass)认证
24-
// cli := New(hostname, token) //预设置Token的客户端
25-
// cli := New(hostname, user, pass) //带用户信息的客户端,会自动调用Auth以获取Token(忽略错误)
26-
func New(hostname string, authParams ...string) *Client {
27-
hostname = strings.TrimSuffix(hostname, "/")
28-
client := &Client{Hostname: hostname + apiPrefix}
18+
// cli := New(addr) //未认证的客户端,需要手动调用cli.Auth(user,pass)认证
19+
// cli := New(addr, token) //预设置Token的客户端
20+
// cli := New(addr, user, pass) //带用户信息的客户端,会自动调用Auth以获取Token(忽略错误)
21+
func New(addr string, authParams ...string) *Client {
22+
client := &Client{
23+
Addr: strings.TrimSuffix(addr, "/"),
24+
}
2925

3026
if len(authParams) == 1 {
3127
client.authToken = authParams[0]
3228
} else if len(authParams) == 2 {
3329
err := client.Auth(authParams[0], authParams[1])
34-
if err !=nil {
35-
fmt.Printf("用户认证失败: %s",err)
30+
if err != nil {
31+
fmt.Printf("用户认证失败: %s", err)
3632
}
3733
}
3834

3935
return client
4036
}
4137

42-
//测试Seafile服务连通性
43-
func (cli *Client) Ping() (string, error) {
44-
resp, err := http.Get(cli.Hostname + "/ping")
45-
if err != nil {
46-
return "", fmt.Errorf("请求错误:%s", err)
47-
}
48-
defer resp.Body.Close()
49-
50-
b, err := ioutil.ReadAll(resp.Body)
51-
if err != nil {
52-
return "", fmt.Errorf("读取错误:%s", err)
53-
}
54-
55-
return string(b), nil
38+
//发起携带Token的Seafile WEB API请求
39+
func (cli *Client) requestApi(apiPrefix, method, uri string, header http.Header, body io.Reader) (*http.Response, error) {
40+
return cli.request(method, cli.Addr+apiPrefix+uri, header, body)
5641
}
5742

58-
//获取AuthToken
59-
func (cli *Client) Auth(username, password string) error {
60-
formData := url.Values{
61-
"username": {username},
62-
"password": {password},
63-
}
64-
65-
resp, err := http.PostForm(cli.Hostname+"/auth-token/", formData)
66-
if err != nil {
67-
return fmt.Errorf("请求错误:%s", err)
68-
}
69-
defer resp.Body.Close()
70-
71-
b, err := ioutil.ReadAll(resp.Body)
72-
if err != nil {
73-
return fmt.Errorf("读取错误:%s %s", resp.Status, err)
74-
}
75-
76-
if resp.StatusCode != http.StatusOK {
77-
return fmt.Errorf("%s %s", resp.Status, string(b))
78-
}
79-
80-
//TODO: 找到真正的返回结构
81-
respInfo := map[string]string{}
82-
err = json.Unmarshal(b, &respInfo)
83-
if err != nil {
84-
return fmt.Errorf("读取错误:%s", err)
85-
}
86-
87-
cli.authToken = respInfo["token"]
88-
89-
if respInfo["token"] == "" {
90-
return fmt.Errorf("%s", string(b))
91-
}
92-
93-
return nil
94-
}
95-
96-
//自动添加Token后执行请求
97-
func (cli *Client) doRequest(method, uri string, header http.Header, body io.Reader) (*http.Response, error) {
43+
func (cli *Client) request(method, uri string, header http.Header, body io.Reader) (*http.Response, error) {
44+
//检查Token是否为空
9845
if cli.authToken == "" {
9946
return nil, fmt.Errorf("没有合法的Token")
10047
}
10148

102-
//如果外部传进来的不是完整的链接(只是路径),则添上默认的Hostname
103-
if !strings.HasPrefix(uri, "http://") && !strings.HasPrefix(uri, "https://") {
104-
uri = cli.Hostname + uri
105-
}
106-
10749
req, err := http.NewRequest(method, uri, body)
10850
if err != nil {
10951
return nil, fmt.Errorf("创建请求错误:%s", err)
11052
}
11153

11254
req.Header.Set("Authorization", "Token "+cli.authToken)
55+
11356
//如果外部传入Header则设置之
11457
for k, v := range header {
11558
for _, vv := range v {
@@ -119,19 +62,3 @@ func (cli *Client) doRequest(method, uri string, header http.Header, body io.Rea
11962

12063
return http.DefaultClient.Do(req)
12164
}
122-
123-
//自动添加Token后执行请求
124-
func (cli *Client) AuthPing() (string, error) {
125-
resp, err := cli.doRequest("GET", "/auth/ping", nil, nil)
126-
if err != nil {
127-
return "", fmt.Errorf("请求错误:%s", err)
128-
}
129-
defer resp.Body.Close()
130-
131-
b, err := ioutil.ReadAll(resp.Body)
132-
if err != nil {
133-
return "", fmt.Errorf("读取错误:%s %s", resp.Status, err)
134-
}
135-
136-
return string(b), nil
137-
}

client_test.go

+3-7
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,13 @@ import (
77

88
func TestPing(t *testing.T) {
99
hostname := os.Getenv("SEAFILE_HOST")
10-
result, err := New(hostname).Ping()
10+
err := New(hostname).Ping()
1111
if err != nil {
1212
t.Fatal(err)
1313
}
14-
15-
t.Log("Ping返回", result)
1614
}
1715

18-
func TestAuthPing(t *testing.T) {
16+
func TestAuth(t *testing.T) {
1917
hostname := os.Getenv("SEAFILE_HOST")
2018
username := os.Getenv("SEAFILE_USER")
2119
password := os.Getenv("SEAFILE_PASS")
@@ -26,12 +24,10 @@ func TestAuthPing(t *testing.T) {
2624
t.Fatal(err)
2725
}
2826

29-
result, err := client.AuthPing()
27+
err = client.AuthPing()
3028
if err != nil {
3129
t.Fatal(err)
3230
}
33-
34-
t.Log("Auth ping返回", result)
3531
}
3632

3733
func TestServerInfo(t *testing.T) {

library.go

+5-5
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ func (cli *Client) GetLibrary(name string) (*Library, error) {
9999
var err error
100100
//如果name为空字符串,则获取默认资料库
101101
if name == "" {
102-
id,err = cli.GetDefaultLibraryId()
102+
id, err = cli.GetDefaultLibraryId()
103103
if err != nil {
104104
return nil, err
105105
}
@@ -129,19 +129,19 @@ func (cli *Client) GetLibrary(name string) (*Library, error) {
129129

130130
//获取默认资料库ID
131131
func (cli *Client) GetDefaultLibraryId() (string, error) {
132-
resp,err := cli.doRequest("GET", "/default-repo/", nil, nil)
133-
if err!=nil {
132+
resp, err := cli.doRequest("GET", "/default-repo/", nil, nil)
133+
if err != nil {
134134
return "", fmt.Errorf("获取默认资料库失败: %s", err)
135135
}
136136
defer resp.Body.Close()
137137

138-
var respInfo struct{
138+
var respInfo struct {
139139
Exists bool
140140
RepoId string `json:"repo_id"`
141141
}
142142

143143
err = json.NewDecoder(resp.Body).Decode(&respInfo)
144-
if err!=nil {
144+
if err != nil {
145145
return "", fmt.Errorf("获取默认资料库失败: %s", err)
146146
}
147147

0 commit comments

Comments
 (0)