public class NewHttpClient2
{
public enum BodyFormat
{
Formed, Json
}
public BodyFormat BodyType;
public string Method;
public Uri Uri;
public Encoding ContentEncoding;
public Dictionary<
string,
object>
Bodys;
public Dictionary<
string,
string>
Headers;
public Dictionary<
string,
string>
Querys;
public int Timeout;
private NewHttpClient2()
{
BodyType =
BodyFormat.Formed;
Method =
"GET";
ContentEncoding =
Encoding.UTF8;
Bodys =
new Dictionary<
string,
object>
();
Headers =
new Dictionary<
string,
string>
();
Querys =
new Dictionary<
string,
string>
();
ServicePointManager.Expect100Continue =
false;
Timeout =
60000;
}
public NewHttpClient2(
string uri) :
this()
{
Uri =
new Uri(uri);
}
public HttpWebRequest HttpWebRequest;
public string UriWithQuery
{
get
{
return Uri +
"?" +
Util.ParseQueryString(Querys);
}
}
public JObject PostAction()
{
HttpWebRequest =
(HttpWebRequest)WebRequest.Create(UriWithQuery);
HttpWebRequest.Method =
Method;
HttpWebRequest.ReadWriteTimeout =
30000;
foreach (
var header
in Headers)
{
HttpWebRequest.Headers.Add(header.Key, header.Value);
}
byte[] body =
null;
switch (BodyType)
{
case BodyFormat.Formed:
{
var bodydata = Bodys.Select(pair => pair.Key +
"=" +
Util.UriEncode(pair.Value.ToString()))
.DefaultIfEmpty("")
.Aggregate((a, b) => a +
"&" +
b);
body =
ContentEncoding.GetBytes(bodydata);
HttpWebRequest.ContentType =
"application/x-www-form-urlencoded";
break;
}
case BodyFormat.Json:
{
var bodydata =
JsonConvert.SerializeObject(Bodys);
body =
ContentEncoding.GetBytes(bodydata);
HttpWebRequest.ContentType =
"application/json";
break;
}
}
if (body !=
null && Bodys.Count >
0)
{
var stream =
HttpWebRequest.GetRequestStream();
stream.Write(body, 0, body.Length);
stream.Close();
}
HttpWebResponse webresp;
try
{
webresp =
(HttpWebResponse)HttpWebRequest.GetResponse();
}
catch (WebException e)
{
//请求失败
throw new ApiException((
int)e.Status, e.Message);
}
if (webresp.StatusCode !=
HttpStatusCode.OK)
{
throw new ApiException((
int)webresp.StatusCode,
"Server response code:" + (
int)webresp.StatusCode);
}
var respdata =
Util.StreamToString(webresp.GetResponseStream(), ContentEncoding);
JObject respJobject;
try
{
respJobject = JsonConvert.DeserializeObject<JObject>
(respdata);
}
catch (Exception e)
{
throw new ApiException(e.Message +
":" +
respdata);
}
if (respJobject ==
null)
{
throw new ApiException(
"Empty response!");
}
return respJobject;
}
}
try
{
var a =
new NewHttpClient2(
"http://localhost:100/.well-known/openid-configuration");
var b =
a.PostAction();
var c =
new NewHttpClient2(b[
"token_endpoint"].ToString())
{
Bodys =
new Dictionary<
string,
object> { {
"scope",
"api1" }, {
"grant_type",
"password" },{
"client_id",
"ro.client" },
{"client_secret",
"secret" },{
"username",
"alice"},{
"password",
"password" } },
Method =
"POST"
};
var d =
c.PostAction();
var e =
new NewHttpClient2(
"http://localhost:101/api/values/get") {
BodyType=
NewHttpClient2.BodyFormat.Json,
Headers=
new Dictionary<
string,
string> { {
"Authorization", d[
"token_type"].ToString() +
" " + d[
"access_token"].ToString() } }
};
var f =
e.PostAction();
return Ok(f);
}
catch (ApiException e)
{
return Ok(e);
}
catch(Exception e)
{
return Ok(e);
}
[Serializable]
public class ApiException:Exception
{
public int Code {
get;
set; }
public ApiException()
{
Code = -
1;
}
public ApiException(
string message) :
base(message)
{
}
public ApiException(
int code,
string message) :
base(message)
{
Code =
code;
}
}
public static string StreamToString(Stream ss, Encoding enc)
{
string ret;
using (
var reader =
new StreamReader(ss, enc))
{
ret =
reader.ReadToEnd();
}
ss.Close();
return ret;
}
public static string UriEncode(
string input,
bool encodeSlash =
false)
{
var builder =
new StringBuilder();
foreach (
var b
in Encoding.UTF8.GetBytes(input))
if (b >=
'a' && b <=
'z' || b >=
'A' && b <=
'Z' || b >=
'0' && b <=
'9' || b ==
'_' || b ==
'-' ||
b ==
'~' || b ==
'.')
builder.Append((char)b);
else if (b ==
'/')
if (encodeSlash)
builder.Append("/");
else
builder.Append((char)b);
else
builder.Append('%').Append(b.ToString(
"X2"));
return builder.ToString();
}
public static string ParseQueryString(Dictionary<
string,
string>
querys)
{
if (querys.Count ==
0)
return "";
return querys
.Select(pair => pair.Key +
"=" +
pair.Value)
.Aggregate((a, b) => a +
"&" +
b);
}
又琢磨http新封装方法了,这个,估计更完善些,返回数据默认能转换为jobject,不然修改postaction下
转载于:https://www.cnblogs.com/huanyun/p/11572348.html
相关资源:C# winhttp 封装类