当前位置: 首页 > 编程日记 > 正文

ASP.NET MVC4中调用WEB API的四个方法

当今的软件开发中,设计软件的服务并将其通过网络对外发布,让各种客户端去使用服务已经是十分普遍的做法。就.NET而言,目前提供了Remoting,WebService和WCF服务,这都能开发出功能十分强大的服务。然而,越来越多的互联网应用,希望将服务只是通过HTTP发布出去,而不是使用复杂的SOAP协议。为了解决这个问题,ASP.NET WebAPI就出现了。

ASP.NET API简单来说就是对REST协议进行了充分的支持,可以使用HTTP中的GET,POST,PUT和DELETE进行服务的发布。在本文中,将以例子说明如何使用ASP.NET WEB API去创建一个REST风格的Web服务,并且如何编写客户端对其进行连接,此外在文中还将学会如何通过HTTP协议,使用Entity Framework和SQL Server去创建一个CRUD(增删改)的应用程序。本文的阅读对象为具备一定ASP.NET MVC基础的用户。

前期准备

为了继续本文的学习,首先需要安装ASP.NET MVC4和JSON.net,ASP.NET Web API是ASP.NET MVC 4 BETA版的一部分,可以从下面这个地址下载得到:http://www.asp.net/mvc/mvc4。

此外,还需要下载Json.NET,它是一个在.NET中高性能的对JSON进行解析处理的类库,下载地址在:http://json.codeplex.com/releases/view/82120, 在本文的学习中,将会用到Json.net。

  创建ASP.NET MVC4 WEB API应用

下面,首先打开VS.NET 2010,然后建立一个新的项目,选择使用C#语言,然后选择ASP.NET MVC4 WEB APPLICATION,再选择使用Web API 模板,如下两个图所示:

创建ASP.NET MVC4 WEB API应用

创建ASP.NET MVC4 WEB API应用

在建立好工程项目后,会发现项目的目录结构跟普通的MVC结构是差不多的,但其中会发现在Controller文件夹中,会发现多一个ValuesController的类文件,这个类是Web API的控制器类,它继承了ApiController类,而不是一般MVC框架中的Controller类,代码如下:

public class ValuesController : ApiController

  {

  ...

  }

ValuesController类会自动生成一个基于REST风格的脚手架,以方便用户进行编码,其中提供了GET,POST,PUT和DELETE方法。下面的表格详细列出了每个HTTP方法的含义:

创建ASP.NET MVC4 WEB API应用

要注意的是,Wep API 本身不会指定以上这些方法中每个方法的具体处理流程,比如,对于服务端的文件系统,可以使用XML数据或者自定义数据存储格式,从而在这些方法中使用,主要是根据目标的操作类型和数据的存储形式,以上这些方法可以接收所需要的数据类型。

在我们继续操作前,先在项目的根目录下创建一个新的名为API的文件夹,并且将ValuesController.cs这个文件放到其中,这样做的目的,主要是为了将Web API控制器跟普通的MVC控制器进行分离,方便今后的开发。

利用Entity Framework创建数据层

现在,往Models文件夹中,新增一个Entity Framework数据实体。我们使用的是Northwind数据库中的Customers表进行操作,命名数据实体为Northwind,如下图:

创建ASP.NET MVC4 WEB API应用

之后,选择customer表,创建一个数据实体customer如下:

创建ASP.NET MVC4 WEB API应用

 Web API控制器的编码

接下来,我们对已经生成了框架的Web控制器进行完善其中的代码,代码如下:

public class CustomersController : ApiController

  {

  //Select All

  public IEnumerable Get()

  {

  NorthwindEntities db = new NorthwindEntities();

  var data = from item in db.Customers

  orderby item.CustomerID

  select item;

  return data.ToList();

  }

  //Select By Id

  public Customer Get(string id)

  {

  NorthwindEntities db = new NorthwindEntities();

  var data = from item in db.Customers

  where item.CustomerID == id

  select item;

  return data.SingleOrDefault();

  }

  //Insert

  public void Post(Customer obj)

  {

  NorthwindEntities db = new NorthwindEntities();

  db.Customers.AddObject(obj);

  db.SaveChanges();

  }

  //Update

  public void Put(string id, Customer obj)

  {

  NorthwindEntities db = new NorthwindEntities();

  var data = from item in db.Customers

  where item.CustomerID == id

  select item;

  Customer old = data.SingleOrDefault();

  old.CompanyName = obj.CompanyName;

  old.ContactName = obj.ContactName;

  old.Country = obj.Country;

  db.SaveChanges();

  }

  //Delete

  public void Delete(string id)

  {

  NorthwindEntities db = new NorthwindEntities();

  var data = from item in db.Customers

  where item.CustomerID == id

  select item;

  Customer obj = data.SingleOrDefault();

  db.Customers.DeleteObject(obj);

  db.SaveChanges();

  }

  }

其中,Get()方法返回了Customers表中的所有数据,是以LIST列表的形式返回的。customer表中的主键为CustomerId列,并且是字符串类型,因此,另外的一个get带参数的方法,是根据传入的ID参数返回了某一个customer的对象实例。

Post()方法则接收一个Customer对象作为参数,并且将其新增到数据表中去,同样,Put()方法中,接收一个customerid,然后在数据表中找出该customer对象,为该customer对象的属性重新赋值,然后再保存;最后Delete方法根据传入的CustomerID参数删除数据表中的数据并保存。

从浏览器中访问WEB API

在通过普通页面作为客户端访问Web API前,首先在浏览器中通过输入地址的方法先测试一下,如下图:

创建ASP.NET MVC4 WEB API应用

注意的是,访问API的方式为:localhost/api/customers,在实际中将要根据情况替换合适的端口,默认所有的WEB API都是通过/api根目录的方式访问的,该路由是在Global.asax下进行定义,如下:

public static void RegisterRoutes(RouteCollection routes)

  {

  ...

  routes.MapHttpRoute(

  name: "DefaultApi",

  routeTemplate: "api/{controller}/{id}",

  defaults: new { id = RouteParameter.Optional }

  );

  ...

  }

因此,现在由于我们的WEB API控制器是customers,因此如何要得到某个顾客的信息,可以如下的方式访问:

/api/customers/ALFKI

创建自定义JSON格式化器

在通过浏览器去访问WEB API时,默认的显示方式是XML。Web API框架会自动根据访问客户端的不同从而返回不同的格式的数据。现在,大多数情况下,用户希望返回的格式数据是JSON形式。然而,在本文写作时,使用默认的Web API提供的JSON格式化处理器以及Entity Framework搭配工作时,会出现一些小BUG.The entities of the EF data model have IsReference property of DataContractAttribute set to True.EF EF数据模型的实体将DataContractAttribute中的IsReference属性设置为true,如下:

...
[Serializable()]
[DataContractAttribute(IsReference=true)]
public partial class Customer : EntityObject
{
...
}

默认情况下,Web API使用的是DataContractJsonSerializer类进行JSON序列化。但默认的JSON序列化类不能处理这样的实体类,并且在运行期间抛出如下异常:

The type 'WebAPIDemo.Models.Customer' cannot be serialized to JSON because its IsReference setting is 'True'. The JSON format does not support references because there is no standardized format for representing references. To enable serialization, disable the IsReference setting on the type or an appropriate parent class of the type.

为了克服则个问题,可以创建一个自定义的JSON格式化器。幸运的是,有第三方的JSON序列化器给我们选择使用,比如Json.NET。在本文中,将会简单介绍使用JSON.NET去完成序列化,完整的代码可以在附件中下载。

一个自定义的序列化器主要是继承了MediaTypeFormatter的基类。我们编写的这个JSON序列化类为JsonNetFormatter,在使用前要确认你的应用工程中已经引用了Json.NET的类库,如下图:

创建自定义JSON格式化器

下面我们来看下JsonNetFormatter的基础代码:

public class JsonNetFormatter : MediaTypeFormatter
{
...
}

可以通过重写MediaTypeFormatter中的一些方法如下:

protected override bool CanReadType(Type type)
{
...
}

protected override bool CanWriteType(Type type)
{
...
}

protected override Task<object> OnReadFromStreamAsync(Type type, Stream stream,
                                              
        HttpContentHeaders contentHeaders,
                                            
          FormatterContext formatterContext)
{
...
}

protected override Task OnWriteToStreamAsync(Type type, object value, Stream stream,
                                   
          HttpContentHeaders contentHeaders,
                                   
          FormatterContext formatterContext,
                             
                TransportContext transportContext)
{
...
}

具体的代码在附件中可以详细查看。一旦创建了JSON序列化器后,就需要告诉Web API框架去替换使用原先默认的JSON序列化框架。可以在global.asx中实现:

protected void Application_Start()
{
    HttpConfiguration config = GlobalConfiguration.Configuration;
    JsonSerializerSettings settings = new JsonSerializerSettings();
    settings.Converters.Add(new IsoDateTimeConverter());
    JsonNetFormatter formatter = new WebAPIDemo.Http.Formatters.JsonNetFormatter(settings);
    config.Formatters.Insert(0, formatter);

    AreaRegistration.RegisterAllAreas();
    RegisterGlobalFilters(GlobalFilters.Filters);
    RegisterRoutes(RouteTable.Routes);
    BundleTable.Bundles.RegisterTemplateBundles();
}

其中请注意粗体字部分,这里创建了JSON自定义器的实例,并且增加到以HttpConfiguration类的配制的序列化配制集合中。

这样,我们就可以开始在客户端中调用WEB API,并使用自定义的JSON解析器进行处理。

  使用jQuery 调用WEB API

接下来,我们在Index控制器中新建立一个视图,如下图:

使用jQuery 调用WEB API

接下来就可以根据实际需要,决定在页面中显示customer表中的多少列,最后的页面显示如下:

使用jQuery 调用WEB API

当页面加载时,使用GET()方法去调出customer表的所有数据,而当使用INSERT,UPDATE,DELETE功能时,是通过jQuery去调用web api的。下面我们学习下通过jQuery去调用WEB API。

首先,我们设计每一行的HTML代码,如下:

<table id="customerTable" border="0" cellpadding="3">
    <tr>
        <th>Customer ID</th>
        <th>Company Name</th>
        <th>Contact Name</th>
        <th>Country</th>
        <th>Actions</th>
    </tr>
    <tr>
        <td><input type="text" id="txtCustomerId" size="5"/></td>
        <td><input type="text" id="txtCompanyName" /></td>
        <td><input type="text" id="txtContactName" /></td>
        <td><input type="text" id="txtCountry" /></td>
        <td><input type="button" name="btnInsert" value="Insert" /></td>
    </tr>
</table>

 首先要引入jQuery类库:

<script src="../../Scripts/jquery-1.6.2.min.js" type="text/javascript"></script>

然后在jQuery中,通过$.getJSON的方法,调用WEB API,代码如下:

$(document).ready(function () {

$.getJSON("api/customers", LoadCustomers);

});

熟悉jQuery的朋友肯定明白,$.getJson方法中第一个参数是调用服务的地址,第二个参数是回调方法,这个回调方法LoadCustomers中,将展示服务端web api返回的数据,代码如下:

function LoadCustomers(data) {
    $("#customerTable").find("tr:gt(1)").remove();
    $.each(data, function (key, val) {
        var tableRow = '<tr>' + 
                        '<td>' + val.CustomerID + '</td>' +
                        '<td><input type="text" value="' + val.CompanyName + '"/></td>' +
                        '<td><input type="text" value="' + val.ContactName + '"/></td>' +
                        '<td><input type="text" value="' + val.Country + '"/></td>' +
                        '<td><input type="button" name="btnUpdate" value="Update" /> 
                             <input type="button" name="btnDelete" value="Delete" /></td>'+ 
                        '</tr>';
        $('#customerTable').append(tableRow);
    });

    $("input[name='btnInsert']").click(OnInsert);
    $("input[name='btnUpdate']").click(OnUpdate);
    $("input[name='btnDelete']").click(OnDelete);
}

在上面的代码中,首先移除所有表格中的行(除了表头外),然后通过jQuery中的each方法,遍历web api返回给前端的数据,最后展现所有的数据行。然后在Insert,update,delete三个按钮中都绑定了相关的方法函数,下面先看update的代码:

function OnUpdate(evt) {
    var cell;
    var customerId = $(this).parent().parent().children().get(0).innerHTML;
    cell = $(this).parent().parent().children().get(1);
    var companyName = $(cell).find('input').val();
    cell = $(this).parent().parent().children().get(2);
    var contactName = $(cell).find('input').val();
    cell = $(this).parent().parent().children().get(3);
    var country = $(cell).find('input').val();

    var data = '{"id":"' + customerId + '", "obj":{"CustomerID":"' + customerId + 
               '","CompanyName":"' + companyName + '","ContactName":"' + 
               contactName + '","Country":"' + country + '"}}';

    $.ajax({
        type: 'PUT',
        url: '/api/customers/',
        data: data,
        contentType: "application/json; charset=utf-8",
        dataType: 'json',
        success: function (results) {
            $.getJSON("api/customers", LoadCustomers);
            alert('Customer Updated !');
        }
    })
}

在上面的代码中,首先从每行的各个文本框中获得要更新的值,然后组织成JSON数据,

其数据格式为包含两项,其中一项包含customer的ID,另外一个是新的customer实体对象,因为WEB API的PUT方法需要的是两个参数。

然后通过jQuery的$.ajax方法进行调用web api,注意这里的type指定为put方法,并且注意编码为UTF-8,然后在回调方法success中,再此使用$.getJSON方法,获得更新后的最新用户列表。

而Insert,Delete的方法代码如下:

function OnInsert(evt) {
    var customerId = $("#txtCustomerId").val();
    var companyName = $("#txtCompanyName").val();
    var contactName = $("#txtContactName").val();
    var country = $("#txtCountry").val();
    var data = '{"obj":{"CustomerID":"' + customerId + '","CompanyName":"' + companyName + 
               '","ContactName":"' + contactName + '","Country":"' + country + '"}}';

    $.ajax({
        type: 'POST',
        url: '/api/customers/',
        data: data,
        contentType: "application/json; charset=utf-8",
        dataType: 'json',
        success: function (results) {
            $("#txtCustomerId").val('');
            $("#txtCompanyName").val('');
            $("#txtContactName").val('');
            $("#txtCountry").val('');
            $.getJSON("api/customers", LoadCustomers);
            alert('Customer Added !');
        }
    })

}
function OnDelete(evt) {
    var customerId = $(this).parent().parent().children().get(0).innerHTML;
    var data = '{"id":"' + customerId + '"}';
    var row = $(this).parent().parent();

    $.ajax({
        type: 'DELETE',
        url: '/api/customers/',
        data: data,
        contentType: "application/json; charset=utf-8",
        dataType: 'json',
        success: function (results) {
            $.getJSON("api/customers", LoadCustomers);
            alert('Customer Deleted!');
        }
    })

}

读者要注意的是,在实际应用中,可以使用含有GET,PUT,DELETE前缀的方法名,比如

GetXXXX(), PutXXXX(), PostXXXX()都是可以的,XXX是自定义的名称,WEB API框架依然会调用对应的GET,PUT和POST方法。

最后运行后,效果如下图:

使用jQuery 调用WEB API

WebForm形式调用WEB API

尽管ASP.NET WEB API是ASP.NET MVC的其中一部分,但并没规定只能在ASP.NET MVC架构中使用,可以在WebForm中进行调用,方法如下:

我们继续在解决方案中新建一个Web Application,然后在应用中增加一个普通的asp.net Web Form页面,然后将之前的API文件夹复制到这个新的web项目的根目录中。

然后和之前的步骤一样,通过Entitiy Framework建立customer实体类,然后打开Global.ascx,写入代码如下:

protected void Application_Start(object sender, EventArgs e)
{
    HttpConfiguration config = GlobalConfiguration.Configuration;
    JsonSerializerSettings settings = new JsonSerializerSettings();
    settings.Converters.Add(new IsoDateTimeConverter());
    JsonNetFormatter formatter = new WebAPIWebFormDemo.Http.Formatters.JsonNetFormatter(settings);
    config.Formatters.Insert(0, formatter);

    RouteTable.Routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "api/{controller}/{id}",
        defaults: new { id = System.Web.Http.RouteParameter.Optional }

    );
}

注意这里做了两个事情,首先在WEB API框架中注册了自定义的JSON解析器,然后是注册了web api 控制器的路由。

然后将前文说到的使用jQuery 调用web api的所有代码都复制到index.aspx(或default.aspx)中去。然后运行应用,如下图:

WebForm形式调用WEB API

可以看到浏览器的地址栏,这里是使用传统的web form表单进行访问的。

  小结

本文介绍了ASP.NET MVC 4中新推出的符合REST架构的WEB API,并以实际例子讲解了如何通过不同的方式调用web api返回的结果。本文的附件是代码,请在这个地址下载:

http://www.developer.com/imagesvr_ce/6193/Code.zip

转载于:https://www.cnblogs.com/liuhuan01/p/5525231.html

相关文章:

使用docker制作hexo镜像

个人博客&#xff1a;戳我&#xff0c;戳我 背景 这段时间一直在折腾我的博客&#xff0c;由于之前出现过一次电脑硬盘完全挂掉的情况&#xff0c;为了避免重新搭建博客系统&#xff0c;一直打算搞一个方便点的环境&#xff0c;能进行多机迁移之类的。正好&#xff0c;Docker完…

3D目标检测深度学习方法数据预处理综述

作者 | 蒋天元来源 | 3D视觉工坊&#xff08;ID: QYong_2014&#xff09;这一篇的内容主要要讲一点在深度学习的3D目标检测网络中&#xff0c;我们都采用了哪些数据预处理的方法&#xff0c;主要讲两个方面的知识&#xff0c;第一个是representation&#xff0c;第二个数据预处…

NTLM协议认证

第一篇blog&#xff0c;发现这是个记录学习过程的好地方。从基础的开始吧。 NTLM&#xff1a; 基本知识telnet的一种验证身份方式&#xff0c;即Windows NT LAN Manager (NTLM)&#xff1b; NTLM 是为没有加入到域中的计算机&#xff08;如独立服务器和工作组&#xff09;提供的…

新盒模型移动端的排版

这里采用的是新盒模型来进行排版&#xff1a; <div class"mytest">   <header></header>   <section></section>   <footer></footer> </div> 在CSS样式里添加如下样式 html,body{ height: 100%; } .mytest{ …

微信跳一跳高分辅助踩坑

旧博文&#xff0c;搬到 csdn 原文&#xff1a;http://rebootcat.com/2018/01/08/wechat_jump_hack/ 最近挺火的微信跳一跳 最近新版微信的『跳一跳』小程序着实火了一把&#xff0c;也把小程序这个概念再次推波助澜了一波&#xff0c;看来以后小程序这个入口会有大作为。 张小…

“编程能力差,90%的人会输在这点上!”谷歌开发:其实都是在瞎努力

这是一个很难让人心平气和的年代。疫情之下&#xff0c;很多人的都在面临着&#xff1a;失业、降薪、找不到工作、随时被裁等风险。但是&#xff1a;有心的人早已上路超车&#xff0c;做个人能力的升级——提高自己的不可替代性。李开复曾提出过“五秒钟准则”&#xff1a;一项…

64位win7安装IIS7时不能浏览asp的问题

64位win7高级家庭版安装IIS7&#xff0c;安装完成后只能浏览静态页&#xff0c;找了很多的教程都没有解决&#xff0c;最后在一个博客里看到说64位系统下ASP是不支持的ODB读取ACC的数据库的&#xff0c;因此需要开启32位应用程序的支持。 方法是&#xff1a; Internet 信息服务…

0525 项目回顾7.0

一、sprint总结 当谈到团队&#xff0c;我开始真的不知道团队是怎么样的&#xff0c;怎么样进行工作的&#xff0c;要该怎么出力团队的关系&#xff0c;有时候会涉及到个人问题&#xff0c;是不是该考虑进来&#xff0c;但是很多时候是不能的&#xff0c;每一个人作为团队的一份…

辩证看待 iostat

旧博文&#xff0c;搬到 csdn 原文&#xff1a;http://rebootcat.com/2018/01/16/using-iostat-dialectically/ 前言 经常做系统分析会接触到很多有用的工具&#xff0c;比如 iostat,它是用来分析磁盘性能、系统 I/O 的利器。 本文将重点介绍 iostat 命令的使用&#xff0c;并…

搞机器学习,Python和R哪个更合适?

【编者按】如果你正想构建一个机器学习项目&#xff0c;但却纠结于如何选择编程语言&#xff0c;这篇文章将是你所需要的。这篇文章不仅帮助你理解Python和R这两种语言的区别&#xff0c;还有助于你了解各个语言多方面的优势。作者 | Manav Jain译者 | Joe&#xff0c;编辑 | 夕…

Java安装方法

第1章 Java简介及开发环境搭建 实验1 JDK的下载、安装与配置 【实验目的】 &#xff08;1&#xff09;熟悉JDK工具包的下载及安装过程。 &#xff08;2&#xff09;掌握JAVA_HOME、CLASSPATH及Path的设置内容。 &#xff08;3&#xff09;掌握Java程序运行原理及Javac、Java命…

Hash函数的安全性

我们为了保证消息的完整性&#xff0c;引进了散列函数&#xff0c;那么散列函数会对安全正造成什么影响呢&#xff1f;这是需要好好研究一番的问题。 三个概念&#xff1a; 1.如果y<>x&#xff0c;且h&#xff08;x&#xff09;h&#xff08;y&#xff09;&#xff0c;则…

一键安装python3环境

旧博文&#xff0c;搬到 csdn 原文&#xff1a;http://rebootcat.com/2018/04/15/python3_in_a_box/ 一键安装python3环境 由于现在逐步转移到 python3 进行开发&#xff0c;但是很多机器并没有预装 python3 环境&#xff0c;所以需要安装。 所以分享一个我常用的&#xff0c…

认知智能再突破,阿里 18 篇论文入选 AI 顶会 KDD

作者 | 马超责编 | 屠敏头图 | CSDN 下载自东方 IC出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;近日&#xff0c;国际知识发现与数据挖掘协会KDD在官网(https://www.kdd.org/kdd2020)公布其2020年度的论文收录结果&#xff0c;笔者看到阿里共有18篇论文入选&…

python采集cpu信息

旧博文&#xff0c;搬到 csdn 原文&#xff1a;http://rebootcat.com/2018/05/20/analyze_cpu/ python脚本采集cpu 经常要做一些 linux 系统上的性能分析或者采集 cpu/mem/bandwidth 上报到监控系统。 分享一个我平常常用到的 cpu 采集脚本&#xff0c;原理是分析 /proc/stat…

Pretty Login便携版:Windows 7登录界面修改器

Pretty Login是由chnable开发的一个美化小工具&#xff0c;用来辅助修改Widnows 7登陆界面的背景图片&#xff0c;除此之外&#xff0c;它也能定制欢迎界面上的文本、按钮样式&#xff0c;如设置阴影、半透明效果。 由于Windows 7限制登录背景图片的大小不超过255KB&#xff0c…

来了来了!趋势预测算法大PK!

作者 | 王哲责编 | Carol头图 | CSDN 付费下载自视觉中国趋势预测在很多应用场景中都会起到至关重要的作用&#xff0c;比如淘宝商家会考虑库存量应该保持在多少才能够满足客户需求&#xff0c;商场希望得知假期会迎来多大的客流量以安排系列活动&#xff0c;机场想要预测五一黄…

hdu 5713(状态压缩DP)

要进行两次dp&#xff0c; 第一个&#xff0c;dp[i],1<i<(1<<n) 其中用i的二进制形式表示已选择的点。 dp[i] 用来保存i中的点构成一个连通块&#xff0c;边集多少种可能。 转移方程&#xff1a; save[0] 1;//这里用save[i]表示dp[i]for(int i1;i<(1<<n)…

nginx特定的 404页面利于seo

要求&#xff1a;访问http://www.qq.com/123 url保持不变 显示的结果为指定的404页面curl -I http://www.qq.com/123 返回的状态码为404 准备一 404.php页面在最底部加上&#xff1a;<?phpheader(HTTP/1.1 404 Not Found);header(Status: 404 Not Found);?>然后ngin…

python采集bandwidth信息

旧博文&#xff0c;搬到 csdn 原文&#xff1a;http://rebootcat.com/2018/05/21/analyze_bandwidth/ python脚本采集bandwidth 经常要做一些 linux 系统上的性能分析或者采集 cpu/mem/bandwidth 上报到监控系统。 分享一个我平常常用到的 bandwidth 采集脚本&#xff0c;原理…

零基础搭建个性化精准营销 AI 应用,这次手把手教你!

百万学AI系列AI 应用开发大师课已经直播两期了&#xff0c;在前两期的内容中&#xff0c;大家在入门级任务《猫狗分类器》中上手 TensorFlow 开发&#xff0c;通过离线 SDK 在 Android 手机中完成人脸识别应用的部署。在这两个任务中&#xff0c;能成功安装开发环境&#xff0c…

C++数据类型简析

C语言的基本数据类型有如下四种&#xff1a; 整型&#xff0c;说明符为int&#xff1b;字符型&#xff0c;说明符为char&#xff1b;浮点型&#xff08;又称实型&#xff09;&#xff0c;说明符为float&#xff08;单精度&#xff09;&#xff0c;double&#xff08;双精度&…

浅谈几种区块链网络攻击以及防御方案之51#37攻击

旧博文&#xff0c;搬到 csdn 原文&#xff1a;http://rebootcat.com/2020/04/11/network_attack_of_blockchain_51_attack/ 写在前面的话 自比特币诞生到现在&#xff0c;比特币&#xff08;网络&#xff09;经历过大大小小非常多次的攻击&#xff0c;尤其在比特币诞生之初的…

全球Python调查报告:Python 2正在消亡,PyCharm比VS Code更受欢迎

作者 | 唐小引题图 | 自东方 IC出品 | AI科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09;一年一度的 Python 开发者调查报告终于发布了。该报告由 Python 软件基金会和 JetBrains 联合发起&#xff0c;已经持续三年&#xff0c;并且参与调查的开发者人数正在逐年上…

中兴V880使用手记之五——刷入recovery

Recovery是安卓系统的一个特殊工作模式&#xff0c;也就是一个刷机的工程界面&#xff0c;给安卓手机刷入Recovery相当于给系统安装了一个dos界面&#xff0c;可以在未开机的状态下&#xff0c;实现系统更新、还原出厂设置、清除手机缓存等。通过一些第三方工具&#xff0c;可以…

windows 系统常用操作

1、所有端口使用情况 netstat -ano 2、查询xxxx端口pid netstat -aon|findstr "xxxx" 3、根据端口Pid查详情 tasklist|findstr "pkd" 4、根据进程pid kill 进程 taskkill /pid pid -f 转载于:https://www.cnblogs.com/vitre/p/5549344.html

浅谈几种区块链网络攻击以及防御方案之日蚀攻击

旧博文&#xff0c;搬到 csdn 原文&#xff1a;http://rebootcat.com/2020/04/12/network_attack_of_blockchain_eclipse_attack/ 写在前面的话 自比特币诞生到现在&#xff0c;比特币&#xff08;网络&#xff09;经历过大大小小非常多次的攻击&#xff0c;尤其在比特币诞生之…

微服务的理想与现实

来源 | 京东智联云开发者随着云原生微服务的日益火热&#xff0c;很多人都开始对微服务的相关知识内容感兴趣。本篇内容&#xff0c;旨在扫盲&#xff08;意思是小白可入&#xff09;&#xff0c;希望能对大家有帮助。如有问题&#xff0c;欢迎大家一起讨论&#xff0c;共同学习…

感恩心成就了车建新和红星美凯龙

前几天参加了红星美凯龙成立25周年庆典活动&#xff0c;庆典活动非常的隆重&#xff0c;庆典之前红地毯上星光熠熠&#xff0c;红星美凯龙掌舵人车建新等多位高管、品牌代言人大小S、刘谦、古巨基、萧亚轩、胡一虎等演艺群星、马未都、马艳丽、包小柏、王潮歌、殷智贤等不同领域…

第二阶段团队项目冲刺站立会议(九)

昨天做了什么&#xff1a; 已经简单实现我的后续显示问题。 今天准备做什么&#xff1a; 美观上的东西来不及做了估计&#xff0c;我要整合到项目的实现上去。 遇到的问题&#xff1a; 项目问题大体上和竞赛一致&#xff0c;但也有不一样的地方。转载于:https://www.cnblogs.co…