就算开发Android APP也得懂一点API接口开发

2024-02-03 04:10

本文主要是介绍就算开发Android APP也得懂一点API接口开发,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

code小生,一个专注 Android 领域的技术分享平台

作者:天兵公园
地址:https://www.jianshu.com/p/3252b0ba84ab
声明:本文已获 天兵公园 授权,转发等请联系原作者授权

很多开发 APP 的童鞋还只是会在 Android Studio 上写一些 Java 代码,对 API 接口,服务之类的知之甚少,也对 HTML/CSS/JS 一片朦胧,我觉得这是不好的,扩大知识面还是很有必要的,就算不能解决实际问题,有时候会提供一种解决问题的思路,比如某个产品老板要你一个月上线,怎么办呢。原生代码一行一行不知道要写到什么时候去了,公司 UI,前端,JS工程师一个都调动不起来。相反如果了解快速开发技巧,混合开发之类的技术,就能减少很多工作量了。

640

我一直喜欢用 .NET 作为后端接口开发语言,因为 .NET 开发效率确实非常高,标准库也非常成熟健全,不至于随便什么都要第三方的,用它主要看中的就是在开发效率和工业标准能够两者都能兼顾的特点,我觉得还行。

640

很多人一打开 Visual Studio 就已经啥了,创建项目都不知道点哪个,也不知道该创建什么类型的项目。是酱紫的,目前微软主要是推 .NET Core 和 .NET Framework 的,.NET Framework 是只能运行在 Windows 平台上的,虽然在 Linux 上有 Mono Runtime 支持 .NET 程序的运行,但是运行效率比 .NET 在 Windows 上的还是有些差距。.NET Core 是微软推出的下一代编程框架,在1.X 版本的时候,只能支持开发 Web 和 CLI 程序,不过如今可以开发 WPF 桌面程序了,虽然目前还只能在 Windows 上运行,但是谁知道以后会不会在 Linux 上也实现了桌面 GUI 环境呢。

.NET Core 很好,网上教程也很多,这个是灰常建议去学习的,不过我还是比较习惯用 ASP.NET MVC 和 WebForm 方式,当然拖控件是不可能拖控件了,这辈子都不可能拖控件,就是用用一般处理程序写写接口,才能维持得了生活的样子。

既然是服务接口,那就意味着没有什么界面,或者及少量的界面,用一般处理程序是坠吼的。

640

创建一个 ASP.NET Web 应用程序 (.NET Framework),然后选择空项目,下一步就可以了。

接下来需要创建一个 HttpHandler 的实现类,并稍作封装,让它成为我们接口的基础类,因为直接使用 HttpHandler 是不那么友好的,目前不需要了解为什么要这么做。

如果是为了考虑稳定性,不那么在乎性能,可以将整个 ProcessRequest 都用 Try Catch 包裹,避免因为接口中的错误,导致 APP 未能处理正确的返回而导致闪退,虽然这种办法很挫,但是我很喜欢用。

 public void ProcessRequest(HttpContext context)
 
{

     if (context.Request.RequestType != "POST")
     {
         context.Response.StatusCode = 405;
         return;
     }

     AllowCrossDomain = true;
     TryExecute.Execute(() =>
     {
         Context = context;
         ProcessUserRequest();
     }, error =>
      {
          bool processed = false;

          if (error is SilverStarAmsException)
          {
              var serror = error as SilverStarAmsException;
              if (serror != null)
              {
                  ResponseAsErrorJson(serror.ErrorCode, serror.Message);
                  processed = true;
              }
          }

          if (!processed)
          {
              ResponseAsErrorJson(-11"process api request error");
          }
      });
 }

其次,API 接口或许会被小程序或其它服务用到,我们对其做一个跨域的测试,在 Header 头输出对应的消息,客户端即可实现跨域请求,这时的客户端通常是浏览器,因为浏览器为了安全性会设置同源策略,如果接口不支持跨域,接口就不能被使用。

在 ASP.NET 里设置 Header 有很多种方法,为了适应 IIS 的经典和集成模式,以及或许有其他 Web 容器的支持,我都会写一遍,哪种支持就是用哪种,然后就有了下面的奇怪的代码:

protected void AppenHeader(string key, string value)
{

    bool done = false;

    try
    {
        Context.Response.AppendHeader(key, value);
        done = true;
    }
    catch
    {

    }

    if (!done)
    {
        try
        {
            Context.Response.Headers.Add(key, value);
            done = true;
        }
        catch
        {

        }
    }

    if (!done)
    {
        try
        {
            Context.Response.AddHeader(key, value);
            done = true;
        }
        catch
        {

        }
    }
}

对于 APP 接口来说,通常是不会或者对于安全性很低的情况下才会用到 GET 请求,当然合服 Restful 规范的可能也会用的多,比如订单的增删改查:

PUT /api/order
DELETE /api/order/12
PATCH /api/order/12
GET /api/order/12

如果觉得不需要这么多的 HTTP 谓词,只用 POST 也是可以的。

640

我上家公司的 APP 接口全部是这种实现,好吧,其实都是我实现的,虽然只有数十万用户,但是目前来看,这种架构还能支撑,而且这也不是性能的瓶颈,只能说在可维护性上断然没有 Restful 方式的好。

640

接下来我需要建立一个数据库,继续是 .NET 当然配合 MSSQL 是坠吼的了,设计数据库和表此处略去不表,ORM 我是用 EntityFramework 6.x 。

以一个简单例子,在数据库中创建了一个 Category 表,表示文章或者某种物体的分类,现在要在 APP 里获取 Category 列表,每页显示 20 条数据,或者由 APP 指定参数。

创建一个一般处理程序,GetCategory.ashx ,继承刚才上面的自定义的 Handler,重写 ProcessUserRequest 接口。

声明三个参数,表示总页数,当前页码,分页大小:

  int page, pageSize, totalPage;

对于数据库的访问,其实超简单,看我怎么查出所有数据:

totalPage = (int)(Math.Ceiling((double)all.Count() / pageSize));

if (page > totalPage) page = totalPage;
if (page < 1) page = 1;

var data = all.OrderByDescending(s => s.CategoryLastChangeDate).Skip((page - 1) * pageSize).Take(pageSize).ToList();

然后输出查询出当前页的数据,并输出到 JSON,对象转为 JSON ,并不能保证是 100% 成功的,对于 APP 的接口服务来说,稳定性最重要,就算是接口出错,也必须得返回出错代码,所以前面的 Handler 的子类有一个超大的 Try ,对于 JSON 输出,也应如此。

protected void ResponseAsJson(object data)
{
    string json = "[]";

    TryExecute.Execute(() =>
    {
        json = Newtonsoft.Json.JsonConvert.SerializeObject(data);

    }, error =>
    {
        json = GetGenericErrorJson(-10"serialize data error");
    });

    ResponseAsJsonString(json);
}

完整的接口代码如下:

/// <summary>
/// GetCategory 的摘要说明
/// </summary>
public class GetCategory : Core.SilverCoreHandlerBase
{

    public override void ProcessUserRequest()
    
{
        base.ProcessUserRequest();

        int page, pageSize, totalPage;

        page = (Context.Request["page"] + "").AsInt(0);
        pageSize = (Context.Request["page_size"] + "").AsInt(0);

        if (page < 1) page = 1;
        if (pageSize < 1 || pageSize > 50) pageSize = 50;

        var db = new Data.SilverStarDB();
        var all = db.KoteiAssetCategory;

        totalPage = (int)(Math.Ceiling((double)all.Count() / pageSize));

        if (page > totalPage) page = totalPage;
        if (page < 1) page = 1;

        var data = all.OrderByDescending(s => s.CategoryLastChangeDate).Skip((page - 1) * pageSize).Take(pageSize).ToList();
        ResponseAsJson(new { page = page, total_page = totalPage, data = data });

    }
}

F5 执行看看,会提示不支持的谓词,当然了,只支持 POST 的啊!可以用 POSTMAN 工具调试。

640

好了,看看最终输出的 JSON 结果:

640

如此,在 APP 中使用相关的 HTTP 库,就可以完成接口的调用了,敲你吗简单!

APP开发

碎阅:一款基于 douban 及 ONE API 开发的资讯类 App

使用 Charles 抓取 app 数据包

Android 新手如何学习开发一款 app?

640


这篇关于就算开发Android APP也得懂一点API接口开发的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/672948

相关文章

PHP应用中处理限流和API节流的最佳实践

《PHP应用中处理限流和API节流的最佳实践》限流和API节流对于确保Web应用程序的可靠性、安全性和可扩展性至关重要,本文将详细介绍PHP应用中处理限流和API节流的最佳实践,下面就来和小编一起学习... 目录限流的重要性在 php 中实施限流的最佳实践使用集中式存储进行状态管理(如 Redis)采用滑动

SpringBoot实现不同接口指定上传文件大小的具体步骤

《SpringBoot实现不同接口指定上传文件大小的具体步骤》:本文主要介绍在SpringBoot中通过自定义注解、AOP拦截和配置文件实现不同接口上传文件大小限制的方法,强调需设置全局阈值远大于... 目录一  springboot实现不同接口指定文件大小1.1 思路说明1.2 工程启动说明二 具体实施2

SpringBoot 多环境开发实战(从配置、管理与控制)

《SpringBoot多环境开发实战(从配置、管理与控制)》本文详解SpringBoot多环境配置,涵盖单文件YAML、多文件模式、MavenProfile分组及激活策略,通过优先级控制灵活切换环境... 目录一、多环境开发基础(单文件 YAML 版)(一)配置原理与优势(二)实操示例二、多环境开发多文件版

使用docker搭建嵌入式Linux开发环境

《使用docker搭建嵌入式Linux开发环境》本文主要介绍了使用docker搭建嵌入式Linux开发环境,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录1、前言2、安装docker3、编写容器管理脚本4、创建容器1、前言在日常开发全志、rk等不同

Android协程高级用法大全

《Android协程高级用法大全》这篇文章给大家介绍Android协程高级用法大全,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友跟随小编一起学习吧... 目录1️⃣ 协程作用域(CoroutineScope)与生命周期绑定Activity/Fragment 中手

Python实战之SEO优化自动化工具开发指南

《Python实战之SEO优化自动化工具开发指南》在数字化营销时代,搜索引擎优化(SEO)已成为网站获取流量的重要手段,本文将带您使用Python开发一套完整的SEO自动化工具,需要的可以了解下... 目录前言项目概述技术栈选择核心模块实现1. 关键词研究模块2. 网站技术seo检测模块3. 内容优化分析模

基于Java开发一个极简版敏感词检测工具

《基于Java开发一个极简版敏感词检测工具》这篇文章主要为大家详细介绍了如何基于Java开发一个极简版敏感词检测工具,文中的示例代码简洁易懂,感兴趣的小伙伴可以跟随小编一起学习一下... 目录你是否还在为敏感词检测头疼一、极简版Java敏感词检测工具的3大核心优势1.1 优势1:DFA算法驱动,效率提升10

Python开发简易网络服务器的示例详解(新手入门)

《Python开发简易网络服务器的示例详解(新手入门)》网络服务器是互联网基础设施的核心组件,它本质上是一个持续运行的程序,负责监听特定端口,本文将使用Python开发一个简单的网络服务器,感兴趣的小... 目录网络服务器基础概念python内置服务器模块1. HTTP服务器模块2. Socket服务器模块

Go语言使用net/http构建一个RESTful API的示例代码

《Go语言使用net/http构建一个RESTfulAPI的示例代码》Go的标准库net/http提供了构建Web服务所需的强大功能,虽然众多第三方框架(如Gin、Echo)已经封装了很多功能,但... 目录引言一、什么是 RESTful API?二、实战目标:用户信息管理 API三、代码实现1. 用户数据

Python用Flask封装API及调用详解

《Python用Flask封装API及调用详解》本文介绍Flask的优势(轻量、灵活、易扩展),对比GET/POST表单/JSON请求方式,涵盖错误处理、开发建议及生产环境部署注意事项... 目录一、Flask的优势一、基础设置二、GET请求方式服务端代码客户端调用三、POST表单方式服务端代码客户端调用四