2014年6月13日星期五

使用C#对REST api的PUT调用

使用C#对REST api的PUT调用


最近需要添加一个REST的api接口,因为之前url都是丑陋的传参数格式,所以这次想试试目前比较网络比较流行的规范,就是同样的url利用访问方式的不同来执行查询、添加、修改、删除操作。

  • GET: 查询数据
  • POST:创建数据
  • PUT: 修改数据
  • DELETE:删除数据

首先是ashx文件部分:

switch (context.Request.RequestType)
{
    case "POST":
        result = CreateWeiXinPordService(context);
        break;
    case "PUT":
        result = ModifyWeiXinPordService(context);
        break;
    default:
        dt = GetWeiXinPordService(context);
        break;
}

由于是修改功能,底层接口都已经实现,于是通过判断请求类型来分别调用不同的接口。

其次是调用:

POST:

using(var client = new WebClient())
{
    var values = new NameValueCollection
    {
        { "memberPKId", "123"},
        { "beginDate", DateTime.Today.ToString()},
        { "endDate", DateTime.Today.ToString()},
        { "shopState", "1"},
        { "memoInfo", ""},
    };
    byte[] result = client.UploadValues("http://api.android.xxx.w/wx/ProdService.ashx", "POST", values);
    tb.Text = Encoding.ASCII.GetString(result);
}

PUT:

using (var client = new WebClient())
{
    var values = new NameValueCollection
    {
        { "servicePKId", "5"},
        { "endDate", this.Request["date"].ToString()},
        { "memoInfo", "修改啦"},
    };
    byte[] result = client.UploadValues("http://api.android.xxx.w/wx/ProdService.ashx", "PUT", values);
    tb2.Text = Encoding.ASCII.GetString(result);
}

在测试PUT方式时,页面报405错误,不允许使用该方法。原来IIS默认是不允许PUT动词的,求助了一下网络,这里再次说一下,stackoverflow是个好地方,唯一的缺点是无法注册,发现解决办法如下。

令IIS支持PUT访问方式的方法

  • 修改站点的web.config文件,添加以下内容
<system.webServer>
    <handlers>
      <remove name="WebDAV" />
      <remove name="SimpleHandlerFactory-Integrated-4.0" />
      <add name="SimpleHandlerFactory-Integrated-4.0" path="*.ashx" verb="*" type="System.Web.UI.SimpleHandlerFactory" resourceType="Unspecified" preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers>
    <modules>
      <remove name="WebDAVModule" />
    </modules>
</system.webServer>

其中path可以指定文件,verb也可以指定几个访问方式,我这里是全部放开。

  • 修改访问文件的系统权限,添加iis_iuser用户组的修改权限

总结

到这里这个PUT的接口就可以顺利运行了,由于最近使用word发现排版非常不方便且不美观,于是自己试着用马克飞象写了这篇markdown格式的日志,感觉非常方便,就是代码块对C#的支持貌似不够好,但是也非常不错了,希望以后能引入工作中。

C#的路由程序还没研究明白,要不可以将url写的更优雅一点,留到下一次吧。

%23%u4F7F%u7528C%23%u5BF9REST%20api%u7684PUT%u8C03%u7528%0A@%28.net%29%5BC%23%7CREST%7CIIS%7CPUT%5D%0A%u6700%u8FD1%u9700%u8981%u6DFB%u52A0%u4E00%u4E2AREST%u7684api%u63A5%u53E3%uFF0C%u56E0%u4E3A%u4E4B%u524Durl%u90FD%u662F%u4E11%u964B%u7684%u4F20%u53C2%u6570%u683C%u5F0F%uFF0C%u6240%u4EE5%u8FD9%u6B21%u60F3%u8BD5%u8BD5%u76EE%u524D%u6BD4%u8F83%u7F51%u7EDC%u6BD4%u8F83%u6D41%u884C%u7684%u89C4%u8303%uFF0C%u5C31%u662F%u540C%u6837%u7684url%u5229%u7528%u8BBF%u95EE%u65B9%u5F0F%u7684%u4E0D%u540C%u6765%u6267%u884C%u67E5%u8BE2%u3001%u6DFB%u52A0%u3001%u4FEE%u6539%u3001%u5220%u9664%u64CD%u4F5C%u3002%0A-%20**GET**%uFF1A%20%u67E5%u8BE2%u6570%u636E%0A-%20**POST**%uFF1A%u521B%u5EFA%u6570%u636E%0A-%20**PUT**%uFF1A%20%u4FEE%u6539%u6570%u636E%0A-%20**DELETE**%uFF1A%u5220%u9664%u6570%u636E%0A%0A%23%23%23%23%u9996%u5148%u662Fashx%u6587%u4EF6%u90E8%u5206%uFF1A%0A%60%60%60%0Aswitch%20%28context.Request.RequestType%29%0A%7B%0A%20%20%20%20case%20%22POST%22%3A%0A%20%20%20%20%20%20%20%20result%20%3D%20CreateWeiXinPordService%28context%29%3B%0A%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20case%20%22PUT%22%3A%0A%20%20%20%20%20%20%20%20result%20%3D%20ModifyWeiXinPordService%28context%29%3B%0A%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20default%3A%0A%20%20%20%20%20%20%20%20dt%20%3D%20GetWeiXinPordService%28context%29%3B%0A%20%20%20%20%20%20%20%20break%3B%0A%7D%0A%60%60%60%0A%u7531%u4E8E%u662F%u4FEE%u6539%u529F%u80FD%uFF0C%u5E95%u5C42%u63A5%u53E3%u90FD%u5DF2%u7ECF%u5B9E%u73B0%uFF0C%u4E8E%u662F%u901A%u8FC7%u5224%u65AD%u8BF7%u6C42%u7C7B%u578B%u6765%u5206%u522B%u8C03%u7528%u4E0D%u540C%u7684%u63A5%u53E3%u3002%0A%0A%23%23%23%23%u5176%u6B21%u662F%u8C03%u7528%uFF1A%0A**POST%uFF1A**%0A%60%60%60C%23%0Ausing%28var%20client%20%3D%20new%20WebClient%28%29%29%0A%7B%0A%20%20%20%20var%20values%20%3D%20new%20NameValueCollection%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%7B%20%22memberPKId%22%2C%20%22123%22%7D%2C%0A%20%20%20%20%20%20%20%20%7B%20%22beginDate%22%2C%20DateTime.Today.ToString%28%29%7D%2C%0A%20%20%20%20%20%20%20%20%7B%20%22endDate%22%2C%20DateTime.Today.ToString%28%29%7D%2C%0A%20%20%20%20%20%20%20%20%7B%20%22shopState%22%2C%20%221%22%7D%2C%0A%20%20%20%20%20%20%20%20%7B%20%22memoInfo%22%2C%20%22%22%7D%2C%0A%20%20%20%20%7D%3B%0A%20%20%20%20byte%5B%5D%20result%20%3D%20client.UploadValues%28%22http%3A//api.android.xxx.w/wx/ProdService.ashx%22%2C%20%22POST%22%2C%20values%29%3B%0A%20%20%20%20tb.Text%20%3D%20Encoding.ASCII.GetString%28result%29%3B%0A%7D%0A%60%60%60%0A%0A**PUT%uFF1A**%0A%60%60%60C%23%0Ausing%20%28var%20client%20%3D%20new%20WebClient%28%29%29%0A%7B%0A%20%20%20%20var%20values%20%3D%20new%20NameValueCollection%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%7B%20%22servicePKId%22%2C%20%225%22%7D%2C%0A%20%20%20%20%20%20%20%20%7B%20%22endDate%22%2C%20this.Request%5B%22date%22%5D.ToString%28%29%7D%2C%0A%20%20%20%20%20%20%20%20%7B%20%22memoInfo%22%2C%20%22%u4FEE%u6539%u5566%22%7D%2C%0A%20%20%20%20%7D%3B%0A%20%20%20%20byte%5B%5D%20result%20%3D%20client.UploadValues%28%22http%3A//api.android.xxx.w/wx/ProdService.ashx%22%2C%20%22PUT%22%2C%20values%29%3B%0A%20%20%20%20tb2.Text%20%3D%20Encoding.ASCII.GetString%28result%29%3B%0A%7D%0A%60%60%60%0A%0A%u5728%u6D4B%u8BD5PUT%u65B9%u5F0F%u65F6%uFF0C%u9875%u9762%u62A5405%u9519%u8BEF%uFF0C%u4E0D%u5141%u8BB8%u4F7F%u7528%u8BE5%u65B9%u6CD5%u3002%u539F%u6765IIS%u9ED8%u8BA4%u662F%u4E0D%u5141%u8BB8PUT%u52A8%u8BCD%u7684%uFF0C%u6C42%u52A9%u4E86%u4E00%u4E0B%u7F51%u7EDC%uFF0C%u8FD9%u91CC%u518D%u6B21%u8BF4%u4E00%u4E0B%uFF0Cstackoverflow%u662F%u4E2A%u597D%u5730%u65B9%uFF0C%u552F%u4E00%u7684%u7F3A%u70B9%u662F%u65E0%u6CD5%u6CE8%u518C%uFF0C%u53D1%u73B0%u89E3%u51B3%u529E%u6CD5%u5982%u4E0B%u3002%0A%23%23%23%23%u4EE4IIS%u652F%u6301PUT%u8BBF%u95EE%u65B9%u5F0F%u7684%u65B9%u6CD5%0A-%20%u4FEE%u6539%u7AD9%u70B9%u7684web.config%u6587%u4EF6%uFF0C%u6DFB%u52A0%u4EE5%u4E0B%u5185%u5BB9%0A%0A%60%60%60XML%0A%3Csystem.webServer%3E%0A%20%20%20%20%3Chandlers%3E%0A%20%20%20%20%20%20%3Cremove%20name%3D%22WebDAV%22%20/%3E%0A%20%20%20%20%20%20%3Cremove%20name%3D%22SimpleHandlerFactory-Integrated-4.0%22%20/%3E%0A%20%20%20%20%20%20%3Cadd%20name%3D%22SimpleHandlerFactory-Integrated-4.0%22%20path%3D%22*.ashx%22%20verb%3D%22*%22%20type%3D%22System.Web.UI.SimpleHandlerFactory%22%20resourceType%3D%22Unspecified%22%20preCondition%3D%22integratedMode%2CruntimeVersionv4.0%22%20/%3E%0A%20%20%20%20%3C/handlers%3E%0A%20%20%20%20%3Cmodules%3E%0A%20%20%20%20%20%20%3Cremove%20name%3D%22WebDAVModule%22%20/%3E%0A%20%20%20%20%3C/modules%3E%0A%3C/system.webServer%3E%0A%60%60%60%0A%u5176%u4E2Dpath%u53EF%u4EE5%u6307%u5B9A%u6587%u4EF6%uFF0Cverb%u4E5F%u53EF%u4EE5%u6307%u5B9A%u51E0%u4E2A%u8BBF%u95EE%u65B9%u5F0F%uFF0C%u6211%u8FD9%u91CC%u662F%u5168%u90E8%u653E%u5F00%u3002%0A-%20%u4FEE%u6539%u8BBF%u95EE%u6587%u4EF6%u7684%u7CFB%u7EDF%u6743%u9650%uFF0C%u6DFB%u52A0iis_iuser%u7528%u6237%u7EC4%u7684%u4FEE%u6539%u6743%u9650%0A%0A-------------------------------%0A%23%23%23%23%u603B%u7ED3%0A%u5230%u8FD9%u91CC%u8FD9%u4E2APUT%u7684%u63A5%u53E3%u5C31%u53EF%u4EE5%u987A%u5229%u8FD0%u884C%u4E86%uFF0C%u7531%u4E8E%u6700%u8FD1%u4F7F%u7528word%u53D1%u73B0%u6392%u7248%u975E%u5E38%u4E0D%u65B9%u4FBF%u4E14%u4E0D%u7F8E%u89C2%uFF0C%u4E8E%u662F%u81EA%u5DF1%u8BD5%u7740%u7528%u9A6C%u514B%u98DE%u8C61%u5199%u4E86%u8FD9%u7BC7markdown%u683C%u5F0F%u7684%u65E5%u5FD7%uFF0C%u611F%u89C9%u975E%u5E38%u65B9%u4FBF%uFF0C%u5C31%u662F%u4EE3%u7801%u5757%u5BF9C%23%u7684%u652F%u6301%u8C8C%u4F3C%u4E0D%u591F%u597D%uFF0C%u4F46%u662F%u4E5F%u975E%u5E38%u4E0D%u9519%u4E86%uFF0C%u5E0C%u671B%u4EE5%u540E%u80FD%u5F15%u5165%u5DE5%u4F5C%u4E2D%u3002%0A%0AC%23%u7684%u8DEF%u7531%u7A0B%u5E8F%u8FD8%u6CA1%u7814%u7A76%u660E%u767D%uFF0C%u8981%u4E0D%u53EF%u4EE5%u5C06url%u5199%u7684%u66F4%u4F18%u96C5%u4E00%u70B9%uFF0C%u7559%u5230%u4E0B%u4E00%u6B21%u5427%u3002

没有评论:

发表评论