using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.IO;
namespace PhalApiClientSDK
{
/**
* PhalApi客户端SDK包(JAVA版)
*
* - 以接口查询语言(ASQL)的方式来实现接口请求
* - 出于简明客户端,将全部的类都归于同一个文件,避免过多的加载
*
*
使用示例:
```
* 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 2015-10-16
*/
public class PhalApiClient {
protected String host;
protected PhalApiClientFilter filter;
protected PhalApiClientParser parser;
protected String service;
protected int timeoutMs;
protected Dictionary 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();
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 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
foreach (KeyValuePair 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();
}
}
}
}