colly_wyx
2018-06-14 bef2c06923d3ba6727654f734bb93d5a09855dc5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
 
 
using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.IO;
 
namespace PhalApiClientSDK
{
 
    /**
     * PhalApi客户端SDK包(JAVA版)
     *
     * - 以接口查询语言(ASQL)的方式来实现接口请求
     * - 出于简明客户端,将全部的类都归于同一个文件,避免过多的加载
     * 
     * <br>使用示例:<br>
     ```
     * PhalApiClientResponse response = PhalApiClient.create()
     *   .withHost("http://demo.phalapi.net/")
     *   .withService("Default.Index")
     *   .withparamsList("name", "dogstar")
     *   .withTimeout(3000)
     *   .request();
     *
     * Log.v("response ret", response.ret + "");
     * Log.v("response data", response.data);
     * Log.v("response msg", response.msg);
    ```
        *
        * @package     PhalApi\Response
        * @license     http://www.phalapi.net/license GPL 协议
        * @link        http://www.phalapi.net/
        * @author      dogstar <chanzonghuang@gmail.com> 2015-10-16
     */
 
    public class PhalApiClient {
 
        protected String host;
        protected PhalApiClientFilter filter;
        protected PhalApiClientParser parser;
        protected String service;
        protected int timeoutMs;
        protected Dictionary<String, String> paramsList;
 
        /**
         * 创建一个接口实例,注意:不是单例模式
         * @return PhalApiClient
         */
        public static PhalApiClient create() {
            return new PhalApiClient();
        }
 
        protected PhalApiClient() {
            this.host = "";
            this.parser = new PhalApiClientParserJson();
 
            this.reset();
        }
 
        /**
         * 设置接口域名
         * @param String host
         * @return PhalApiClient
         */
        public PhalApiClient withHost(String host) {
            this.host = host;
            return this;
        }
 
        /**
         * 设置过滤器,与服务器的DI().filter对应
         * @param PhalApiClientFilter filter 过滤器
         * @return PhalApiClient
         */
        public PhalApiClient withFilter(PhalApiClientFilter filter) {
            this.filter = filter;
            return this;
        }
 
        /**
         * 设置结果解析器,仅当不是JSON返回格式时才需要设置
         * @param PhalApiClientParser parser 结果解析器
         * @return PhalApiClient
         */
        public PhalApiClient withParser(PhalApiClientParser parser) {
            this.parser = parser;
            return this;
        }
 
        /**
         * 重置,将接口服务名称、接口参数、请求超时进行重置,便于重复请求
         * @return PhalApiClient
         */
        public PhalApiClient reset() {
            this.service = "";
            this.timeoutMs = 3000;
            this.paramsList = new Dictionary<String, String>();
        
            return this;
        }
 
        /**
         * 设置将在调用的接口服务名称,如:Default.Index
         * @param String service 接口服务名称
         * @return PhalApiClient
         */
        public PhalApiClient withService(String service) {
            this.service = service;
            return this;
        }
 
        /**
         * 设置接口参数,此方法是唯一一个可以多次调用并累加参数的操作
         * @param String name 参数名字
         * @param String value 值
         * @return PhalApiClient
         */
        public PhalApiClient withParams(String name, String value) {
            this.paramsList.Add(name, value);
            return this;
        }
 
        /**
         * 设置超时时间,单位毫秒
         * @param int timeoutMS 超时时间,单位毫秒
         * @return PhalApiClient
         */
        public PhalApiClient withTimeout(int timeoutMs) {
            this.timeoutMs = timeoutMs;
            return this;
        }
 
        /**
         * 发起接口请求
         * @return PhalApiClientResponse
         */
        public PhalApiClientResponse request() {
            String url = this.host;
 
            if (this.service != null && this.service.Length > 0) {
                url += "?service=" + this.service;
            }
            if (this.filter != null) {
                this.filter.filter(this.service, this.paramsList);
            }
 
            try {
                String rs = this.doRequest(url, this.paramsList, this.timeoutMs);
                return this.parser.parse(rs);
            } catch (Exception ex) {
                //return new PhalApiClientResponse(408, new JSONObject(), ex.Message);
                return new PhalApiClientResponse(408); //TODO
            }
        }
    
        protected String doRequest(String requestUrl, Dictionary<String, String> paramsList, int timeoutMs) {
            String result = null;
            Encoding encoding = Encoding.Default;
 
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(requestUrl);
 
            request.Method = "post";
 
            request.Accept = "text/html, application/xhtml+xml, */*";
 
            request.ContentType = "application/x-www-form-urlencoded";
 
            String strPostdata = "";
            //KeyValuePair<T,K>
            foreach (KeyValuePair<String, String> kv in paramsList)
            {
                strPostdata += "&" + kv.Key + "=" + kv.Value;
            }
            byte[] buffer = encoding.GetBytes(strPostdata);
 
            request.ContentLength = buffer.Length;
 
            request.GetRequestStream().Write(buffer, 0, buffer.Length);
 
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
 
            using (StreamReader reader = new StreamReader(response.GetResponseStream(), System.Text.Encoding.GetEncoding("utf-8")))
            {
 
                return reader.ReadToEnd();
            }  
 
           
        }
    }
}