|
- package net.phalapi.sdk;
-
- import java.io.BufferedReader;
- import java.io.DataOutputStream;
- import java.io.IOException;
- import java.io.InputStreamReader;
- import java.net.HttpURLConnection;
- import java.net.URL;
- import java.net.URLEncoder;
- import java.util.HashMap;
- import java.util.Iterator;
- import java.util.Map;
- import java.util.Map.Entry;
-
- import org.json.JSONObject;
-
- import android.util.Log;
-
- /**
- * PhalApi客户端SDK包(JAVA版)
- *
- * - 以接口查询语言(ASQL)的方式来实现接口请求
- * - 出于简明客户端,将全部的类都归于同一个文件,避免过多的加载
- *
- * <br>使用示例:<br>
- ```
- * PhalApiClientResponse response = PhalApiClient.create()
- * .withHost("http://demo.phalapi.net/")
- * .withService("Default.Index")
- * .withParams("name", "dogstar")
- * .withTimeout(3000)
- * .request();
- *
- * Log.v("response ret", response.getRet() + "");
- * Log.v("response data", response.getData());
- * Log.v("response msg", response.getMsg());
- ```
- *
- * @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 Map<String, String> params;
-
- /**
- * 创建一个接口实例,注意:不是单例模式
- * @return PhalApiClient
- */
- public static PhalApiClient create() {
- return new PhalApiClient();
- }
-
- protected PhalApiClient() {
- this.host = "";
- this.reset();
-
- this.parser = new PhalApiClientParserJson();
- }
-
- /**
- * 设置接口域名
- * @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.params = new HashMap<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.params.put(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.params);
- }
-
- try {
- String rs = this.doRequest(url, this.params, this.timeoutMs);
- return this.parser.parse(rs);
- } catch (Exception ex) {
- return new PhalApiClientResponse(408, "", ex.getMessage());
- }
- }
-
- protected String doRequest(String requestUrl, Map<String, String> params, int timeoutMs) throws Exception {
- String result = null;
- URL url = null;
- HttpURLConnection connection = null;
- InputStreamReader in = null;
-
- url = new URL(requestUrl);
- connection = (HttpURLConnection) url.openConnection();
- connection.setDoInput(true);
- connection.setDoOutput(true);
- connection.setRequestMethod("POST"); // 请求方式
- connection.setUseCaches(false);
- connection.setConnectTimeout(timeoutMs);
-
- DataOutputStream out = new DataOutputStream(connection.getOutputStream());
-
- //POST参数
- String postContent = "";
- Iterator<Entry<String, String>> iter = params.entrySet().iterator();
- while (iter.hasNext()) {
- Map.Entry<String, String> entry = (Map.Entry<String, String>) iter.next();
- postContent += "&" + entry.getKey() + "=" + entry.getValue();
- }
- out.writeBytes(postContent);
- out.flush();
- out.close();
-
- Log.d("[PhalApiClient requestUrl]", requestUrl + postContent);
-
- in = new InputStreamReader(connection.getInputStream());
- BufferedReader bufferedReader = new BufferedReader(in);
- StringBuffer strBuffer = new StringBuffer();
- String line = null;
- while ((line = bufferedReader.readLine()) != null) {
- strBuffer.append(line);
- }
- result = strBuffer.toString();
-
- Log.d("[PhalApiClient apiResult]", result);
-
- if (connection != null) {
- connection.disconnect();
- }
-
- if (in != null) {
- try {
- in.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
-
- return result;
- }
- }
|