写在前面

上篇文章介绍如何将wcf项目,修改成restful风格的接口,并在上面提供了查询的功能,上篇文章中也感谢园友在评论中的提的建议,自己也思考了下,确实是那个道理。在urltemplate中,定义的url确实不规范,虽然能实现功能,但是缺少点专业性。rest风格的请求,是通过post,delete,get,put等请求方法来区别的,而不是通过在url中取不同的名字来进行区别。这里再次感谢@~Js园友提醒。

在这篇文章中将最新的代码贴出来,方便查看。

系列文章

Restful风格wcf调用 (其中代码中的uritemplate定义不规范,建议参考本文)

代码示例

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;
using System.Web.Script.Services; namespace Wolfy.WCFRestfuleDemo
{
// NOTE: You can use the "Rename" command on the "Refactor" menu to change the interface name "IService1" in both code and config file together.
[ServiceContract]
public interface IUserService
{
/// <summary>
/// 获得所有的用户信息
/// </summary>
/// <returns>json或者xml</returns>
[OperationContract]
[WebGet(UriTemplate = "api/users", ResponseFormat = WebMessageFormat.Xml)]
List<UserInfo> QueryList();
/// <summary>
/// 根据id查询用户信息
/// </summary>
/// <param name="where"></param>
/// <returns></returns>
[OperationContract]
[WebGet(UriTemplate = "api/users/{where}", ResponseFormat = WebMessageFormat.Json)]
UserInfo Query(string where); /// <summary>
/// 根据编号删除用户信息
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[OperationContract]
[WebInvoke(UriTemplate = "api/users/{id}", Method = "DELETE", ResponseFormat = WebMessageFormat.Xml)]
bool Delete(string id);
/// <summary>
/// 添加用户信息
/// </summary>
/// <param name="userInfo"></param>
/// <returns></returns>
[OperationContract]
[WebInvoke(UriTemplate = "api/users", Method = "POST", ResponseFormat = WebMessageFormat.Xml, RequestFormat = WebMessageFormat.Json)]
bool Insert(UserInfo userInfo);
/// <summary>
/// 更新用户信息
/// </summary>
/// <param name="userInfo"></param>
/// <returns></returns>
[OperationContract]
[WebInvoke(UriTemplate = "api/users", Method = "PUT", ResponseFormat = WebMessageFormat.Xml, RequestFormat = WebMessageFormat.Json)]
bool Update(UserInfo userInfo);
}
}

修改的地方:uriTemplate,以名词组成,具体的操作通过Method谓词进行区分,另外参数中UserInfo,为其WebInvoke设置RequestFormat(请求数据类型)属性,设置为json格式的数据,这样在服务端介绍到数据后,系统内部将对齐进行反序列化为具体的实体类。还有合并按照id和name查询的接口,因为原来设置的uritemplate为api/users/{id}和api/users/{name}而且请求的方法都是get方法,无法区别到底调用哪个,所以将两个方法合并为了一个方法。
1、删除Http(delete),根据id找到用户信息,并从集合中移除。

        /// <summary>
/// 根据编号删除用户信息
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public bool Delete(string id)
{
//当前操作上下文
WebOperationContext woc = WebOperationContext.Current;
//状态码
woc.OutgoingResponse.StatusCode = System.Net.HttpStatusCode.OK;
try
{
if (string.IsNullOrEmpty(id))
{
throw new ArgumentNullException("id");
}
var users = QueryList();
int iId = Convert.ToInt32(id);
var user = users.Where(x => x.ID == iId).FirstOrDefault();
woc.OutgoingResponse.StatusCode = System.Net.HttpStatusCode.Accepted;
return users.Remove(user);
}
catch (Exception ex)
{
//异常 输出状态
woc.OutgoingResponse.StatusCode = System.Net.HttpStatusCode.ExpectationFailed;
woc.OutgoingResponse.StatusDescription = ex.Message;
return false;
}
}

2、添加Http(post),POST里的数据格式通过RequestFormat定义为Json,WCF框架接受到Json数据的请求,会自动反序列化成UserInfo实例。

         /// <summary>
/// 添加用户信息
/// </summary>
/// <param name="userInfo"></param>
/// <returns></returns>
public bool Insert(UserInfo userInfo)
{
var users = QueryList();
WebOperationContext woc = WebOperationContext.Current;
woc.OutgoingResponse.StatusCode = System.Net.HttpStatusCode.OK;
try
{
users.Add(userInfo);
woc.OutgoingResponse.StatusCode = System.Net.HttpStatusCode.Created;
return true;
}
catch (Exception ex)
{
//异常 输出状态
woc.OutgoingResponse.StatusCode = System.Net.HttpStatusCode.ExpectationFailed;
woc.OutgoingResponse.StatusDescription = ex.Message;
return false;
}
}

3、修改(Http/Put),根据id找到要修改的对象,对该对象重新赋值。

        /// <summary>
/// 更新用户信息
/// </summary>
/// <param name="userInfo"></param>
/// <returns></returns>
public bool Update(UserInfo userInfo)
{
var users = QueryList();
WebOperationContext woc = WebOperationContext.Current;
try
{
var user = users.Where(x => x.ID == userInfo.ID).FirstOrDefault();
if (user != null)
{
user = userInfo;
woc.OutgoingResponse.StatusCode = System.Net.HttpStatusCode.Accepted;
return true;
}
else
{
woc.OutgoingResponse.StatusCode = System.Net.HttpStatusCode.NotFound;
return false;
} }
catch (Exception ex)
{
//异常 输出状态
woc.OutgoingResponse.StatusCode = System.Net.HttpStatusCode.ExpectationFailed;
woc.OutgoingResponse.StatusDescription = ex.Message;
return false;
}
}

4、查询(http/get)

  /// <summary>
/// 获得所有的用户信息
/// </summary>
/// <returns>json或者xml</returns>
public List<UserInfo> QueryList()
{
return new List<UserInfo>() {
new UserInfo() { ID = , Name = "wofly", Age = , Birthday = DateTime.Now, Gender = true },
new UserInfo() { ID = , Name = "san zhang", Age = , Birthday = DateTime.Now, Gender = true },
new UserInfo() { ID = , Name = "wukong sun", Age = , Birthday = DateTime.Now, Gender = false },
new UserInfo() { ID = , Name = "zi ma", Age = , Birthday = DateTime.Now, Gender = true }
};
}

服务端的异常处理中通过 OutgoingResponse.StatusCode 返回不同的Code。

查询成功 —— System.Net.HttpStatusCode.OK (默认)。

创建成功 —— System.Net.HttpStatusCode.Created

更新或者删除成功 —— System.Net.HttpStatusCode.Accepted

当然,HttpStatusCode枚举不止这几个。感兴趣的可以查看这个枚举。你会发现,包揽了常见的一些状态枚举。

   // Summary:
// Contains the values of status codes defined for HTTP.
public enum HttpStatusCode
{
// Summary:
// Equivalent to HTTP status 100. System.Net.HttpStatusCode.Continue indicates
// that the client can continue with its request.
Continue = ,
//
// Summary:
// Equivalent to HTTP status 101. System.Net.HttpStatusCode.SwitchingProtocols
// indicates that the protocol version or protocol is being changed.
SwitchingProtocols = ,
//
// Summary:
// Equivalent to HTTP status 200. System.Net.HttpStatusCode.OK indicates that
// the request succeeded and that the requested information is in the response.
// This is the most common status code to receive.
OK = ,
//
// Summary:
// Equivalent to HTTP status 201. System.Net.HttpStatusCode.Created indicates
// that the request resulted in a new resource created before the response was
// sent.
Created = ,
//
// Summary:
// Equivalent to HTTP status 202. System.Net.HttpStatusCode.Accepted indicates
// that the request has been accepted for further processing.
Accepted = ,
//
// Summary:
// Equivalent to HTTP status 203. System.Net.HttpStatusCode.NonAuthoritativeInformation
// indicates that the returned metainformation is from a cached copy instead
// of the origin server and therefore may be incorrect.
NonAuthoritativeInformation = ,
//
// Summary:
// Equivalent to HTTP status 204. System.Net.HttpStatusCode.NoContent indicates
// that the request has been successfully processed and that the response is
// intentionally blank.
NoContent = ,
//
// Summary:
// Equivalent to HTTP status 205. System.Net.HttpStatusCode.ResetContent indicates
// that the client should reset (not reload) the current resource.
ResetContent = ,
//
// Summary:
// Equivalent to HTTP status 206. System.Net.HttpStatusCode.PartialContent indicates
// that the response is a partial response as requested by a GET request that
// includes a byte range.
PartialContent = ,
//
// Summary:
// Equivalent to HTTP status 300. System.Net.HttpStatusCode.MultipleChoices
// indicates that the requested information has multiple representations. The
// default action is to treat this status as a redirect and follow the contents
// of the Location header associated with this response.
MultipleChoices = ,
//
// Summary:
// Equivalent to HTTP status 300. System.Net.HttpStatusCode.Ambiguous indicates
// that the requested information has multiple representations. The default
// action is to treat this status as a redirect and follow the contents of the
// Location header associated with this response.
Ambiguous = ,
//
// Summary:
// Equivalent to HTTP status 301. System.Net.HttpStatusCode.MovedPermanently
// indicates that the requested information has been moved to the URI specified
// in the Location header. The default action when this status is received is
// to follow the Location header associated with the response.
MovedPermanently = ,
//
// Summary:
// Equivalent to HTTP status 301. System.Net.HttpStatusCode.Moved indicates
// that the requested information has been moved to the URI specified in the
// Location header. The default action when this status is received is to follow
// the Location header associated with the response. When the original request
// method was POST, the redirected request will use the GET method.
Moved = ,
//
// Summary:
// Equivalent to HTTP status 302. System.Net.HttpStatusCode.Found indicates
// that the requested information is located at the URI specified in the Location
// header. The default action when this status is received is to follow the
// Location header associated with the response. When the original request method
// was POST, the redirected request will use the GET method.
Found = ,
//
// Summary:
// Equivalent to HTTP status 302. System.Net.HttpStatusCode.Redirect indicates
// that the requested information is located at the URI specified in the Location
// header. The default action when this status is received is to follow the
// Location header associated with the response. When the original request method
// was POST, the redirected request will use the GET method.
Redirect = ,
//
// Summary:
// Equivalent to HTTP status 303. System.Net.HttpStatusCode.SeeOther automatically
// redirects the client to the URI specified in the Location header as the result
// of a POST. The request to the resource specified by the Location header will
// be made with a GET.
SeeOther = ,
//
// Summary:
// Equivalent to HTTP status 303. System.Net.HttpStatusCode.RedirectMethod automatically
// redirects the client to the URI specified in the Location header as the result
// of a POST. The request to the resource specified by the Location header will
// be made with a GET.
RedirectMethod = ,
//
// Summary:
// Equivalent to HTTP status 304. System.Net.HttpStatusCode.NotModified indicates
// that the client's cached copy is up to date. The contents of the resource
// are not transferred.
NotModified = ,
//
// Summary:
// Equivalent to HTTP status 305. System.Net.HttpStatusCode.UseProxy indicates
// that the request should use the proxy server at the URI specified in the
// Location header.
UseProxy = ,
//
// Summary:
// Equivalent to HTTP status 306. System.Net.HttpStatusCode.Unused is a proposed
// extension to the HTTP/1.1 specification that is not fully specified.
Unused = ,
//
// Summary:
// Equivalent to HTTP status 307. System.Net.HttpStatusCode.RedirectKeepVerb
// indicates that the request information is located at the URI specified in
// the Location header. The default action when this status is received is to
// follow the Location header associated with the response. When the original
// request method was POST, the redirected request will also use the POST method.
RedirectKeepVerb = ,
//
// Summary:
// Equivalent to HTTP status 307. System.Net.HttpStatusCode.TemporaryRedirect
// indicates that the request information is located at the URI specified in
// the Location header. The default action when this status is received is to
// follow the Location header associated with the response. When the original
// request method was POST, the redirected request will also use the POST method.
TemporaryRedirect = ,
//
// Summary:
// Equivalent to HTTP status 400. System.Net.HttpStatusCode.BadRequest indicates
// that the request could not be understood by the server. System.Net.HttpStatusCode.BadRequest
// is sent when no other error is applicable, or if the exact error is unknown
// or does not have its own error code.
BadRequest = ,
//
// Summary:
// Equivalent to HTTP status 401. System.Net.HttpStatusCode.Unauthorized indicates
// that the requested resource requires authentication. The WWW-Authenticate
// header contains the details of how to perform the authentication.
Unauthorized = ,
//
// Summary:
// Equivalent to HTTP status 402. System.Net.HttpStatusCode.PaymentRequired
// is reserved for future use.
PaymentRequired = ,
//
// Summary:
// Equivalent to HTTP status 403. System.Net.HttpStatusCode.Forbidden indicates
// that the server refuses to fulfill the request.
Forbidden = ,
//
// Summary:
// Equivalent to HTTP status 404. System.Net.HttpStatusCode.NotFound indicates
// that the requested resource does not exist on the server.
NotFound = ,
//
// Summary:
// Equivalent to HTTP status 405. System.Net.HttpStatusCode.MethodNotAllowed
// indicates that the request method (POST or GET) is not allowed on the requested
// resource.
MethodNotAllowed = ,
//
// Summary:
// Equivalent to HTTP status 406. System.Net.HttpStatusCode.NotAcceptable indicates
// that the client has indicated with Accept headers that it will not accept
// any of the available representations of the resource.
NotAcceptable = ,
//
// Summary:
// Equivalent to HTTP status 407. System.Net.HttpStatusCode.ProxyAuthenticationRequired
// indicates that the requested proxy requires authentication. The Proxy-authenticate
// header contains the details of how to perform the authentication.
ProxyAuthenticationRequired = ,
//
// Summary:
// Equivalent to HTTP status 408. System.Net.HttpStatusCode.RequestTimeout indicates
// that the client did not send a request within the time the server was expecting
// the request.
RequestTimeout = ,
//
// Summary:
// Equivalent to HTTP status 409. System.Net.HttpStatusCode.Conflict indicates
// that the request could not be carried out because of a conflict on the server.
Conflict = ,
//
// Summary:
// Equivalent to HTTP status 410. System.Net.HttpStatusCode.Gone indicates that
// the requested resource is no longer available.
Gone = ,
//
// Summary:
// Equivalent to HTTP status 411. System.Net.HttpStatusCode.LengthRequired indicates
// that the required Content-length header is missing.
LengthRequired = ,
//
// Summary:
// Equivalent to HTTP status 412. System.Net.HttpStatusCode.PreconditionFailed
// indicates that a condition set for this request failed, and the request cannot
// be carried out. Conditions are set with conditional request headers like
// If-Match, If-None-Match, or If-Unmodified-Since.
PreconditionFailed = ,
//
// Summary:
// Equivalent to HTTP status 413. System.Net.HttpStatusCode.RequestEntityTooLarge
// indicates that the request is too large for the server to process.
RequestEntityTooLarge = ,
//
// Summary:
// Equivalent to HTTP status 414. System.Net.HttpStatusCode.RequestUriTooLong
// indicates that the URI is too long.
RequestUriTooLong = ,
//
// Summary:
// Equivalent to HTTP status 415. System.Net.HttpStatusCode.UnsupportedMediaType
// indicates that the request is an unsupported type.
UnsupportedMediaType = ,
//
// Summary:
// Equivalent to HTTP status 416. System.Net.HttpStatusCode.RequestedRangeNotSatisfiable
// indicates that the range of data requested from the resource cannot be returned,
// either because the beginning of the range is before the beginning of the
// resource, or the end of the range is after the end of the resource.
RequestedRangeNotSatisfiable = ,
//
// Summary:
// Equivalent to HTTP status 417. System.Net.HttpStatusCode.ExpectationFailed
// indicates that an expectation given in an Expect header could not be met
// by the server.
ExpectationFailed = ,
//
UpgradeRequired = ,
//
// Summary:
// Equivalent to HTTP status 500. System.Net.HttpStatusCode.InternalServerError
// indicates that a generic error has occurred on the server.
InternalServerError = ,
//
// Summary:
// Equivalent to HTTP status 501. System.Net.HttpStatusCode.NotImplemented indicates
// that the server does not support the requested function.
NotImplemented = ,
//
// Summary:
// Equivalent to HTTP status 502. System.Net.HttpStatusCode.BadGateway indicates
// that an intermediate proxy server received a bad response from another proxy
// or the origin server.
BadGateway = ,
//
// Summary:
// Equivalent to HTTP status 503. System.Net.HttpStatusCode.ServiceUnavailable
// indicates that the server is temporarily unavailable, usually due to high
// load or maintenance.
ServiceUnavailable = ,
//
// Summary:
// Equivalent to HTTP status 504. System.Net.HttpStatusCode.GatewayTimeout indicates
// that an intermediate proxy server timed out while waiting for a response
// from another proxy or the origin server.
GatewayTimeout = ,
//
// Summary:
// Equivalent to HTTP status 505. System.Net.HttpStatusCode.HttpVersionNotSupported
// indicates that the requested HTTP version is not supported by the server.
HttpVersionNotSupported = ,
}

public enum HttpStatusCode

因为REST 是基于HTTP的, 所以对于 REST 的客户端的开发者,无法像使用传统的 WebService或者其他的WCF服务通过引用wsdl,享受“奢侈”的代码生成,而使用强类型的本地代理调用服务。开发者只能使用Http请求来进行请求,而使得客户端真正是语言无关的。

Microsoft.Http.dll 和 Microsoft.Http.Extensions.dll,它们是微软提供的REST客户端包。可以更加方便地操作 HttpRequest/Response,你可以在这里下到: http://aspnet.codeplex.com/releases/view/24644

下载:WCF REST Starter Kit Preview 2.msi

安装之后,在这里C:\Program Files (x86)\Microsoft WCF REST\WCF REST Starter Kit Preview 2\Assemblies(默认安装的) 你可以找到相关的程序集

代码片段

查询:HttpClient.Get方法发送get请求,返回的是HttpResponseMessage,HttpResponseMessage.Content 返回的是你在服务端设置ResponseFormat = WebMessageFormat.Xml数据,当然也可以返回json数据。

            var client = new HttpClient();
var strUrl = "http://localhost:21074/userInfo/api/users";
var response = client.Get(strUrl);
response.EnsureStatusIsSuccessful();
var xml = response.Content.ReadAsString();
Console.WriteLine(xml);
Console.Read();

添加数据,将数据序列化成Json格式放进 HttpContent 再使用 HttpClient.Post 提交 HttpContent 数据。
HttpContent 需要指定 ContentType 是Json格式的。

            var client = new HttpClient();
var strPostUrl = "http://localhost:21074/userInfo/api/users";
var postData = new { ID = , Name = "zhang san", Gender = true, Birthday = DateTime.Now, Age = };
System.Web.Script.Serialization.JavaScriptSerializer jss = new JavaScriptSerializer();
HttpContent content = HttpContent.Create(Encoding.UTF8.GetBytes(jss.Serialize(postData)),"application/json");
HttpResponseMessage responseMessage = client.Post(strPostUrl, content);
Console.WriteLine(responseMessage.EnsureStatusIsSuccessful().StatusCode);

服务端

客户端

更新数据:找到id为1的用户信息,并修改。

            var client = new HttpClient();
var strPostUrl = "http://localhost:21074/userInfo/api/users";
var postData = new { ID = , Name = "zhang san", Gender = true, Birthday = DateTime.Now, Age = };
System.Web.Script.Serialization.JavaScriptSerializer jss = new JavaScriptSerializer();
HttpContent content = HttpContent.Create(Encoding.UTF8.GetBytes(jss.Serialize(postData)), "application/json");
HttpResponseMessage responseMessage = client.Put(strPostUrl, content);
Console.WriteLine(responseMessage.EnsureStatusIsSuccessful().StatusCode);

客户端

删除数据:找到id为1的,删除它

            var client = new HttpClient();
var strPostUrl = "http://localhost:21074/userInfo/api/users/{0}";
HttpResponseMessage responseMessage = client.Delete(string.Format(strPostUrl,));
Console.WriteLine(responseMessage.EnsureStatusIsSuccessful().StatusCode);
Console.Read();

总结

这里将restful的增删改查操作重新修改了下,需要注意的地方是,操作的处理是以Method方法而定,而不是url,post(增加),get(查询),delete(删除),put(更改),通过上面的例子你也会发现,请求的url相同,但是不同的请求谓词(post,get,delete,put)带来的操作并不相同。另外本文也介绍了客户但HttpClient的使用。

参考文章:

http://blog.csdn.net/fangxing80/article/details/6247297

Restful风格wcf调用2——增删改查的更多相关文章

  1. Restful风格wcf调用4——权限认证

    写在前面 在前面的三篇文章,已经介绍了restful风格wcf,如何实现增删改查以及文件的上传下载操作.本篇文章将介绍一下,调用restful的权限认证的内容.在调用的接口,为了安全,总会需要对请求进 ...

  2. Restful风格wcf调用

    文章:Restful风格wcf调用 作者相当于把wcf服务改造成rest风格. Restful风格wcf调用2——增删改查 这篇文章在第一篇的基础上,进行了优化. Restful风格wcf调用3——S ...

  3. Restful风格wcf调用3——Stream

    写在前面 上篇文章介绍了restful接口的增删改查,本篇文章将介绍,如何通过数据流进行文件的上传及下载操作. 系列文章 Restful风格wcf调用 Restful风格wcf调用2——增删改查 一个 ...

  4. restful 架构风格的curd(增删改查)

    restful架构 概念:REST指的是一组架构约束条件和原则,如果一个架构符合REST的约束条件和原则,就称之为RESTful架构. restful不是一个专门的技术,他是一个规范.规范就是写写代码 ...

  5. Yii框架实现restful 接口调用,增删改查

    创建模块modules; 在main.php中配置文件:(1) (2)控制器层: namespace frontend\modules\v1\controllers;use frontend\modu ...

  6. REST风格的增删改查(1)

    一.RESTFUL风格的CRUD(增删改查)案例 1.需求: ①显示所有员工信息:URI:emps,请求方式:GET ②添加员工所有信息:显示添加页面:URI:emp,请求方式:GET, 添加员工信息 ...

  7. SpringMVC4+MyBatis3+SQLServer 2014 整合(包括增删改查分页)

    前言 说起整合自然离开ssm,我本身并不太喜欢ORM,尤其是MyBatis,把SQL语句写在xml里,尤其是大SQL,可读性不高,出错也不容易排查. 开发环境 idea2016.SpringMVC4. ...

  8. nodejs+express+mysql实现restful风格的增删改查示例

    首先,放上项目github地址:https://github.com/codethereforam/express-mysql-demo 一.前言 之前学的java,一直用的ssm框架写后台.前段时间 ...

  9. 进入全屏 nodejs+express+mysql实现restful风格的增删改查示例

    首先,放上项目github地址:https://github.com/codethereforam/express-mysql-demo 一.前言 之前学的java,一直用的ssm框架写后台.前段时间 ...

随机推荐

  1. docker挂载本地目录和数据卷容器

    1.docker挂载本地目录 docker可以支持把一个宿主机上的目录挂载到镜像里. 交互模式运行docker run -it -v /home/dock/Downloads:/usr/Downloa ...

  2. vmware esxi 4.1单IP访问不同机器

    1 vmware ESXI先创建虚拟机ROS作为路由  ROS设置两张网卡 WAN网卡对应外网IP LAN网卡对应LAN IP 设置网卡名 int set 0 name=wai             ...

  3. Spring Security3十五日研究(转载)

    前言 南朝<述异记>中记载,晋王质上山砍柴,见二童子下棋,未看完,斧柄已烂,下山回村,闻同代人都去世了,自已还未变老.    因此发出“山中方一日,世上几千年” 的慨叹.原文寥寥几笔,读来 ...

  4. vs2005+WinCE模拟器+ActiveSync调试WinCE程序

    来源:http://www.cnblogs.com/xjimmyshcn/archive/2011/07/19/2111087.html 一.WinCE 模拟器通过ActiveSync 6.1(即Wi ...

  5. 由浅入深了解Thrift(1,2,3)

    由浅入深了解Thrift(一)——Thrift介绍与用法 由浅入深了解Thrift(二)——Thrift工作原理 由浅入深了解Thrift(三)——Thrift server端的几种工作模式分析

  6. Python Web框架——Flask

    简介 Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收http请求并对请求进行预处理 ...

  7. python3.6编程第一课画个五角星

    使用的是海龟图库  turtle import turtle turtle.forward(100) turtle.right(144) turtle.forward(100) turtle.righ ...

  8. mybatis 3 -枚举

    定义枚举: public static enum AppStateEnum { Valid("有效"), Virtual("虚拟"), Hide("隐 ...

  9. escape(), encodeURL(), encodeURIComponent()

    escape() 方法: 采用ISO Latin字符集对指定的字符串进行编码.所有的空格符.标点符号.特殊字符以及其他非ASCII字符都将被转化成%xx格式的字符编码(xx等于该字符在字符集表里面的编 ...

  10. 【转】Unity Scene场景自定义坐标轴

    来自:https://blog.csdn.net/cheng624/article/details/70859054 多看看别人的代码是没有坏处的,即使学不了人家的大框架,偶尔拾起一些小东西也是可以的 ...