202 lines
7.6 KiB
C#
202 lines
7.6 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using System.Net;
|
|
using System.Net.Sockets;
|
|
using System.IO;
|
|
using System.Diagnostics;
|
|
using Newtonsoft.Json;
|
|
|
|
namespace Lskj.PubUtils
|
|
{
|
|
public static class BaseHttpClient
|
|
{
|
|
private const String CHARSET = "UTF-8";
|
|
private const String RATE_LIMIT_QUOTA = "X-Rate-Limit-Limit";
|
|
private const String RATE_LIMIT_Remaining = "X-Rate-Limit-Remaining";
|
|
private const String RATE_LIMIT_Reset = "X-Rate-Limit-Reset";
|
|
|
|
private const int RESPONSE_OK = 200;
|
|
|
|
//设置连接超时时间
|
|
private const int DEFAULT_CONNECTION_TIMEOUT = (20 * 1000); // milliseconds
|
|
//设置读取超时时间
|
|
private const int DEFAULT_SOCKET_TIMEOUT = (30 * 1000); // milliseconds
|
|
|
|
public static ResponseWrapper sendPost(String url, String auth, String reqParams)
|
|
{
|
|
return sendRequest( "POST", url, auth, reqParams);
|
|
}
|
|
public static ResponseWrapper sendDelete(String url, String auth, String reqParams)
|
|
{
|
|
return sendRequest("DELETE", url, auth, reqParams);
|
|
}
|
|
public static ResponseWrapper sendGet(String url, String auth, String reqParams)
|
|
{
|
|
return sendRequest("GET", url, auth, reqParams);
|
|
}
|
|
/**
|
|
*
|
|
* method "POST" or "GET"
|
|
* url
|
|
* auth 可选
|
|
*/
|
|
public static ResponseWrapper sendRequest(String method, String url, String auth, String reqParams)
|
|
{
|
|
Console.WriteLine("Send request - " + method.ToString() + " " + url + " "+ DateTime.Now);
|
|
if (null != reqParams)
|
|
{
|
|
Console.WriteLine("Request Content - " + reqParams +" "+ DateTime.Now);
|
|
}
|
|
ResponseWrapper result = new ResponseWrapper();
|
|
HttpWebRequest myReq = null;
|
|
HttpWebResponse response = null;
|
|
try
|
|
{
|
|
myReq = (HttpWebRequest)WebRequest.Create(url);
|
|
myReq.Method = method;
|
|
myReq.ContentType = "application/json";
|
|
if ( !String.IsNullOrEmpty(auth) )
|
|
{
|
|
myReq.Headers.Add("Authorization", "Basic " + auth);
|
|
}
|
|
if (method == "POST")
|
|
{
|
|
byte[] bs = UTF8Encoding.UTF8.GetBytes(reqParams);
|
|
myReq.ContentLength = bs.Length;
|
|
using (Stream reqStream = myReq.GetRequestStream())
|
|
{
|
|
reqStream.Write(bs, 0, bs.Length);
|
|
reqStream.Close();
|
|
}
|
|
}
|
|
response = (HttpWebResponse)myReq.GetResponse();
|
|
HttpStatusCode statusCode = response.StatusCode;
|
|
result.responseCode = statusCode;
|
|
if (Equals(response.StatusCode, HttpStatusCode.OK))
|
|
{
|
|
using (StreamReader reader = new StreamReader(response.GetResponseStream(), System.Text.Encoding.UTF8))
|
|
{
|
|
result.responseContent = reader.ReadToEnd();
|
|
}
|
|
String limitQuota = response.GetResponseHeader(RATE_LIMIT_QUOTA);
|
|
String limitRemaining = response.GetResponseHeader(RATE_LIMIT_Remaining);
|
|
String limitReset = response.GetResponseHeader(RATE_LIMIT_Reset);
|
|
result.setRateLimit(limitQuota, limitRemaining, limitReset);
|
|
Console.WriteLine("Succeed to get response - 200 OK" +" "+ DateTime.Now);
|
|
Console.WriteLine("Response Content - {0}", result.responseContent +" "+ DateTime.Now);
|
|
}
|
|
}
|
|
catch (WebException e)
|
|
{
|
|
if (e.Status == WebExceptionStatus.ProtocolError)
|
|
{
|
|
HttpStatusCode errorCode = ((HttpWebResponse)e.Response).StatusCode;
|
|
string statusDescription = ((HttpWebResponse)e.Response).StatusDescription;
|
|
using (StreamReader sr = new StreamReader(((HttpWebResponse)e.Response).GetResponseStream(), System.Text.Encoding.UTF8))
|
|
{
|
|
result.responseContent = sr.ReadToEnd();
|
|
}
|
|
result.responseCode = errorCode;
|
|
result.exceptionString = e.Message;
|
|
String limitQuota = ((HttpWebResponse)e.Response).GetResponseHeader(RATE_LIMIT_QUOTA);
|
|
String limitRemaining = ((HttpWebResponse)e.Response).GetResponseHeader(RATE_LIMIT_Remaining);
|
|
String limitReset = ((HttpWebResponse)e.Response).GetResponseHeader(RATE_LIMIT_Reset);
|
|
result.setRateLimit(limitQuota, limitRemaining, limitReset);
|
|
Debug.Print(e.Message);
|
|
//result.setErrorObject();
|
|
Console.WriteLine(string.Format("fail to get response - {0}", errorCode) + " "+ DateTime.Now);
|
|
Console.WriteLine(string.Format("Response Content - {0}", result.responseContent) + " "+ DateTime.Now);
|
|
|
|
throw ;
|
|
}
|
|
else
|
|
{//
|
|
throw;
|
|
}
|
|
|
|
}
|
|
//这里不再抓取非http的异常,如果异常抛出交给开发者自行处理
|
|
//catch (System.Exception ex)
|
|
//{
|
|
// String errorMsg = ex.Message;
|
|
// Debug.Print(errorMsg);
|
|
//}
|
|
finally
|
|
{
|
|
if (response != null)
|
|
{
|
|
response.Close();
|
|
}
|
|
if(myReq != null)
|
|
{
|
|
myReq.Abort();
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|
|
}
|
|
public class ResponseWrapper
|
|
{
|
|
private const int RESPONSE_CODE_NONE = -1;
|
|
|
|
//private static Gson _gson = new Gson();
|
|
|
|
public HttpStatusCode responseCode = HttpStatusCode.BadRequest;
|
|
private String _responseContent;
|
|
public String responseContent
|
|
{
|
|
get
|
|
{
|
|
return _responseContent;
|
|
}
|
|
set
|
|
{
|
|
_responseContent = value;
|
|
}
|
|
}
|
|
|
|
public int rateLimitQuota;
|
|
public int rateLimitRemaining;
|
|
public int rateLimitReset;
|
|
|
|
public bool isServerResponse()
|
|
{
|
|
return responseCode == HttpStatusCode.OK;
|
|
}
|
|
public String exceptionString;
|
|
|
|
public ResponseWrapper()
|
|
{
|
|
}
|
|
public void setRateLimit(String quota, String remaining, String reset)
|
|
{
|
|
if (null == quota) return;
|
|
try
|
|
{
|
|
if (quota != "" && StringUtil.IsInt(quota))
|
|
{
|
|
rateLimitQuota = int.Parse(quota);
|
|
}
|
|
if (remaining != "" && StringUtil.IsInt(remaining))
|
|
{
|
|
rateLimitRemaining = int.Parse(remaining);
|
|
}
|
|
if (reset != "" && StringUtil.IsInt(reset))
|
|
{
|
|
rateLimitReset = int.Parse(reset);
|
|
}
|
|
Console.WriteLine(string.Format("JPush API Rate Limiting params - quota:{0}, remaining:{1}, reset:{2} ", quota, remaining, reset) + " " + DateTime.Now);
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
Debug.Print(e.Message);
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|