using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
namespace ImageService
{
public class HttpClient
{
HttpClient _client = new HttpClient();
public string ServiceBase
{
get;
set;
}
public TR PostInvoke<TI, TR>(string method, TI param)
{
if (string.IsNullOrWhiteSpace(method))
{
throw new ArgumentNullException("method");
}
if (string.IsNullOrWhiteSpace(ServiceBase))
{
throw new NullReferenceException("ServiceBase is empty.");
}
var json = JsonConvert.SerializeObject(param);
var content = new ByteArrayContent(Encoding.UTF8.GetBytes(json));
content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/json") { CharSet = "UTF-8" };
_client.DefaultRequestHeaders.Add("Accept", "application/json");
_client.DefaultRequestHeaders.Add("token", GenerateSecretKey());
var postTask = _client.PostAsync(ServiceBase + method, content);
postTask.Wait();
var requestTask = postTask.Result.Content.ReadAsStringAsync();
requestTask.Wait();
var result = JsonConvert.DeserializeObject<TR>(requestTask.Result);
return result;
}
public TR PutInvoke<TI, TR>(string method, TI param)
{
var json = JsonConvert.SerializeObject(param);
var content = new ByteArrayContent(Encoding.UTF8.GetBytes(json));
content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/json") { CharSet = "UTF-8" };
_client.DefaultRequestHeaders.Add("token", GenerateSecretKey());
_client.DefaultRequestHeaders.Add("Accept", "application/json");
var putTask = _client.PutAsync(method, content);
putTask.Wait();
var requestTask = putTask.Result.Content.ReadAsStringAsync();
requestTask.Wait();
var result = JsonConvert.DeserializeObject<TR>(requestTask.Result);
return result;
}
public TR GetInvoke<TR>(string requestUri)
{
_client.DefaultRequestHeaders.Add("token", GenerateSecretKey());
_client.DefaultRequestHeaders.Add("Accept", "application/json");
var getTask = _client.GetAsync(requestUri);
getTask.Wait();
var requestTask = getTask.Result.Content.ReadAsStringAsync();
requestTask.Wait();
var result = JsonConvert.DeserializeObject<TR>(requestTask.Result);
return result;
}
public TR DeleteInvoke<TR>(string requestUri)
{
_client.DefaultRequestHeaders.Add("token", GenerateSecretKey());
_client.DefaultRequestHeaders.Add("Accept", "application/json");
var deleteTask = _client.DeleteAsync(requestUri);
deleteTask.Wait();
var requestTask = deleteTask.Result.Content.ReadAsStringAsync();
requestTask.Wait();
var result = JsonConvert.DeserializeObject<TR>(requestTask.Result);
return result;
}
private string GenerateSecretKey()
{
string date = DateTime.Now.ToString("yyyy-MM-dd");
string token = DESEncrypt.Encode(date);
return token;
}
}
}
在HTTP中,PUT被定义为idempotent的方法,POST则不是,这是一个很重要的区别。
“Methods can also have the property of "idempotence" in that (aside from error or expiration issues) the side-effects of N > 0 identical requests is the same as for a single request.”
上面的话就是说,如果一个方法重复执行多次,产生的效果是一样的,那就是idempotent的。也许你会觉得这个两个方法的差别没什么大不了的,用错了也不会有什么问题,但是你的服务一放到internet上,如果不遵从HTTP协议的规范,就可能给自己带来麻烦。比如,没准Google Crawler也会访问你的服务,如果让一个不是indempotent的服务可以用indempotent的方法访问,那么你服务器的状态可能就会被Crawler修改,这是不应该发生的。
国外文章摘录,具体忘记名称作者和url了~