.Net Core 开发电商后端API 从0到精通吃透RESTful

146 阅读13分钟

download:.Net Core 开发电商后端API 从0到精通吃透RESTful

**随着前后端分离成为市场主流,使用RESTful风格构建企业级应用已经是行业共识,但市场上对RESTful风格的认知及开发能力却参差不齐。本课程通过开发“慕课旅游网”项目,带领大家吃透RESTful思想,真正掌握高成熟度(HATEOAS超媒体引擎)级别RESTful API的开发技能。课程项目采用.Net Core框架,以开源、轻量、跨平台优势受到技术市场欢迎,是极其适合网站后端开发的热门技术框架。
**

**

适合人群
向往极致RESTful风格开发;
对.Net Core开发感兴趣的在校学生、初或中级程序员
技术储备要求
熟悉C#基础语法**

一、用户界面典范

1.自界说窗口

体系主题或自界说主题都必须在清单文件中设置。

一切经过 Activity.requestWindowFeature()办法修改窗口特性的恳求都必须在调用

Activity.setContentView()之前完成。在此之后的一切改动都不会生效。

//设置自界说标题的布局资源

getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE,R.layout.custom_title);

2.动态开关体系的UI控件

夜间方式 API Level 11

任何视图中调用 setSystemUiVisibility()

即可。而想要恢复到默许方式,需求以同样的方式调用 SYSTEM_UI_FLAG_VISIBLE。通

过调用 getSystemUiVisibility()并检查标识的当时状态就能够知道我们现在所在的方式了 。

XML 布局文件中的根元素是 LayoutInflater. inflate()回来的 View 元素

3.屏幕分辨率

低分辨率(ldpi): 120 dpi 尺度是 mdpi 的 75%

中分辨率(mdpi): 160 dpi 原始的图片尺度

高分辨率(hdpi): 240 dpi 尺度是 mdpi 的 150%

超高分辨率(xhdpi): 320 dpi (API Level 8 新增) 尺度是 mdpi 的 200%

超级高(xxhdpi): 480 dpi (API Level 16 新增) 尺度是 mdpi 的 300%

4.锁定Activity方向

android:screenOrientation="portrait"或 android:screenOrientation="landscape"

假如为 Activity 设置了 android:screenOrientation="behind", Activity 就会跟 Activity 栈中前一个 Activity 的方向保持一致

android:configChanges="orientation|keyboardHidden" />

在一条赋值语句中能够注册多种变动,用“ |”符号将它们分隔即可。

5.弹出菜单

也能够调用 Activity.openContextMenu()来触发任意视图的 ContextMenu,传入之前注

册的视图即可。

程序清单 2-29 自界说布局的 AlertDialog

public class CustomItemActivity extends Activity

implements DialogInterface.OnClickListener, View.OnClickListener {

private static final String[] ZONES = {"Pacific Time", "Mountain Time",

"Central Time", "Eastern Time", "Atlantic Time"};

private static final String[] OFFSETS =

{"GMT-08:00", "GMT-07:00", "GMT-06:00", "GMT-05:00", "GMT-04:00"};

Button mButton;

AlertDialog mActions;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setTitle("Activity");

mButton = new Button(this);

mButton.setText("Click for Time Zones");

mButton.setOnClickListener(this);

ArrayAdapteradapter = new ArrayAdapter(this,

R.layout.list_item) {

@Override

public View getView(int position, View convertView, ViewGroup parent) {

View row = convertView;

if(row == null) {

row = getLayoutInflater().inflate(R.layout.list_item,

parent, false);

}

TextView name = (TextView) row.findViewById(R.id.text_name);

TextView detail = (TextView) row.findViewById(R.id.text_detail);

name.setText(ZONES[position]);

detail.setText(OFFSETS[position]);

return row;

}

@Override

public int getCount() {

return ZONES.length;

}};

AlertDialog.Builder builder = new AlertDialog.Builder(this);

builder.setTitle("Select Time Zone");

builder.setAdapter(adapter, this);

//这儿的撤销动作只会让对话框消失,但在用户单击 Cancel 按钮时,也能够添加一个

//监听器来处理一些其他的操作

builder.setNegativeButton("Cancel", null);

mActions = builder.create();

setContentView(mButton);

}

//这儿处理列表的挑选事件

@Override

public void onClick(DialogInterface dialog, int which) {

String selected = ZONES[which];

mButton.setText(selected);

}

//这儿处理 Button 的单击事件(弹出对话框)

@Override

public void onClick(View v) {

mActions.show();

}

}

6.模仿home键

Intent intent = new Intent(Intent.ACTION_MAIN);

intent.addCategory(Intent.CATEGORY_HOME);

startActivity(intent);

7.TextView

SDK 中有一些很便利的预界说的用于格式化文本输入的 TextWatcher 实例

8.动画

Android SDK的AnimationUtils 类加载

滑入和渐显AnimationUtils.makeInAnimation()用布尔参数决议滑入的方向是左边仍是右侧向上

滑入和渐显 AnimationUtils.makeInChildBottomAnimation() 视图总是从屏幕的底部向上滑入

滑出和渐隐 AnimationUtils.makeOutAnimation() 用布尔参数决议滑入的方向是左边仍是右侧

渐隐 AnimationUtils.loadAnimation() 将 int 参数设为 android.R.anim.fade_out

渐显 AnimationUtils.loadAnimation() 将 int 参数设为 android.R.anim.fade_in

AlphaAnimation 以动画的守时改动视图的透明度。

RotateAnimation 以动画的方式改动视图的旋转角度。中心点是可装备的,默许是左上角。

ScaleAnimation 以动画的方式改动视图的缩放比例(巨细)。中心点是默许是左上角。

TranslateAnimation 以动画的方式改动视图的方位。

动画视图 ViewPropertyAnimator

ObjectAnimator

在 XML 顶用标签界说 Drawable 时,实际上是创立了一个 GradientDrawable

方针。方针的形状能够是矩形、椭圆、线条或圆圈,最常见的布景形状是矩形。具体来说,

在运用矩形时,能够用下面这些参数界说形状:

● 角半径 界说 4 个角的半径,或是分别界说各个角的半径。

● 突变 线性、放射或 sweep 突变。两个或三个色彩值。方向能够是 45°的任何倍数(0 便是从左到右, 90 便是从下到上,以此类推)。

● 固定色彩 用一种色彩填充形状。 假如一同界说了突变的话,作用会受影响。

● 边线 方针形状的边界。 界说宽度和色彩。

● 巨细和 padding

XML 中色彩的种类约束是 3 种,可是 GradientDrawable 的构造函数中的色彩参数是一个整型数组int[],传递多少色彩都能够。

Activity 间的过渡动画, 能够运用 overridePendingTransition()

Fragment 的过渡动画,能够运用 onCreateAnimation()或 onCreateAnimator()

经过调用 setCustomAnimations()覆写单个 FragmentTransaction 的

过渡动画。

setCustomAnimations()必须在 add()、 replace()和其他动作办法之前调用,不然动画将不

会运行。

9.圆角遮罩

首先在 Canvas 中依据所需的圆角半径创立一个圆角矩形,然后以 PorterDuff.Mode.SRC_IN 为画笔在同一个 Canvas 上绘制源图,得到的便是带圆角的源图。

10.Dialog

呈现给用户的界面需求在旋转过程中保持状态,始终处于最前端,更好的办法是

运用 Activity。这样就能够经过各种生命周期回调办法来保存和读取状态。

11.自界说Enter键

android:imeOptions

actionUnspecified:默许值,依据设备的状况显现动作。

actionGo:在 Enter 键上显现 Go。

ActionSearch:在 Enter 键上显现 Search。

actionSend:在 Enter 键上显现 Send。

antionNext:在 Enter 键上显现 Next。

actionDone:在 Enter 键上显现 Done。

自界说用户按下按键时所触发的动作。重

载动作的默许行为需求给相应的视图加上 TextView.OnEditorActionListener。

用 InputMethodManager.hideSoftInputFromWindow()办法能够让输入法管理器隐藏可见

的输入法。

12.listview

ExpandableListView 控件及其适配器能够处理分节列表中的二维数据结构。

13.getPageWidth()。

这个办法允许你在每个方位上设置图片页面巨细相关于 ViewPager 页面巨细的百分比。默

认值为 1,前面的示例也没有改动该默许值。但假如要一次显现几个页面,能够经过调整

这个办法的回来值来完成

二、显现web信息

1.经过url显现的运用

拜访XX网站

经过web服务器显现实时更新的页面,能够动态更新

显现大资源图片,经过缩放来交互

2.显现本地资源

可用assets目录存储本地资源 file:///android_asset

可显现string资源或变量中的原始html代码

3.经过WebviewClient阻拦事件

WebViewClient.shouldOverrideUrlLoading()回调来阻拦和监控用户的 Activity

shouldOverrideUrlLoading()会依据传入的 URL 决议是否要在 WebView 中加

载内容, 防止用户脱离想要展现 的网站。

WebView.addJavascriptInterface()会为 JavaScript 绑定一个 Java 方针,这样就能够在

WebView 中调用 Java 的办法。会存在javascript注入问题

4.下载图片

彻底在后台下载运用DownloadManager API service 支撑断点续传

DownloadManager.Request 恳求方针,它代表了下载的内容

Request.setAllowedNetworkTypes():指定下载所运用的网络类型

Request.setAllowedOverRoaming():设定当设备处于漫游方式时是否要下载。

Request.setDescription():设置下载在体系告诉栏中显现的描述。

Request.setDestinationInExternalFilesDir():设置方针方位为外部存储器中的一个隐藏目录

Request.setDestinationInExternalPublicDir():设置方针方位为外部存储器中的一公共目录

Request.setDestinationUri():设置方针方位为坐落外部存储器中一个文件 Uri

三。通信

1.接纳短信

注册一个 BroadcastReceiver 来监听收到的音讯,并在 onReceive()中处理它们。当收到一条短信时,操作体系会发送一个 action 值为 android.provider.Telephony.SMS_RECEIVED

的播送 Intent。运用程序则能够注册一个 BroadcastReceiver 过滤这个 Intent 并处理收到的

数据。接纳短信需求在 manifest 中声明 android.permission.RECEIVE_SMS 权限。

2.蓝牙通信

蓝牙上的衔接是经过发现可用的“服务”,并经过一个 128 位的 UUID 衔接到相应的服务。

android.permission.BLUETOOTH 权限。另外,想要改动蓝牙的可发现性以及启用/禁用蓝牙适配器,还要在 manifest 中声明android.permission.BLUETOOTH_ADMIN 权限

3.查询网络衔接状态

经过 ConnectivityManager 监控设备的网络衔接状态。

public boolean isNetworkReachable() {

ConnectivityManager mManage = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);

NetworkInfo current = mManager.getActiveNetworkInfo();

if(current == null) {

return false;

}

return (current.getState() == NetworkInfo.State.CONNECTED);

}

判别链接类型

return (current.getType() == ConnectivityManager.TYPE_WIFI);

4.运用NFC传输数据

依据想要推送内容的巨细,有两种机制能够用来在两个设备间 Beam 数据。

第一种. 运用前台 Push 进行 Beam。假如运用 NFC 在设备间发送简略的内容, 能够运用前台推送机制来创立一个 NfcMessage,它包含了一个或多个 NfcRecord 实例。

第二种,Android Application Record

5.运用 Beam 来发送大型图片文件

6.USB链接

端点: USB 设备的最小构件。运用程序最终便是经过衔接端点发送和接纳数据的。首要分4 种类型:

y 操控传输:用于装备和状态指令。每个设备至少一个操控端点,即“端点 0”,不会相关任何接口。

y 中断传输:用于小量的、高优先级的操控指令。

y 批量传输:用于传输大数据。一般都是双向成对出现的(1 IN 和 1 OUT)。

同步传输:用于实时数据传输,如音频。编撰本书时最新的 Android SDK 还不支撑这个功能。

● 接口:端点的集合,用来表明一个“逻辑”设备 。

y 多个物理 USB 设备关于主机来说能够呈现为多个逻辑设备, 即经过露出接口来标识 。

● 装备:一个或多个接口的集合。 USB 强制规定一个设备在某一特守时间只能有一个装备是激活的。事实上,大都设备也就只有一个装备,并把它作为设备的操作方式

四、设备硬件交互

1.定位

需求留意设备的电量以及尊重用户的志愿

GPS 回来的信息愈加精确(差错为几米),但需求的时间更长并且更耗电,

而网络方位一般精确到几千米,但速度更快并且省电

android.permission.ACCESS_COARSE_LOCATION 或

android.permission.ACCESS_FINE_LOCATION 权限

(1) 判别所需的方位信息源是否可用。假如不可用的话,决议是要求用户启用它仍是

测验其他的信息源。

(2) 用恰当的最小距离和更新时间距离注册设备方位的改变状况。

(3) 当不需求时,及时撤销对设备方位改变状况的注册,以节约电量。

2.地图方位

百度、高德、谷歌

3.拍摄相片和视频

将保存图片的文件方位指定为设备的外部存储器指定 android.permission.

WRITE_EXTERNAL_STORAGE 权限。

在摄像头不用时及时调用Camera.release()办法在摄像头不用时及时调用Camera.release()办法

录音

private void resetRecorder() {

//告诉录音机将运用设备的麦克作为音频输入源(AudioSource.MIC)

recorder.setAudioSource(MediaRecorder.AudioSource.MIC);

recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);

recorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);

recorder.setOutputFile(path.getAbsolutePath());

try {

recorder.prepare();

} catch (Exception e) {

e.printStackTrace();

}

}

经过 android.speech 包中的类能够运用 Android 设备中内置的语音辨认技能。

4.传感器

运用 SensorManager 接纳来自于加速度计传感器继续的反馈数据

registerListener()的最后一个参数界说了更新频率。这儿挑选的是 SENSOR_DELAY_UI,它是接纳更新的最快频率,每次更新都会直接修改 UI。

每当传感器有新值更新,都会用 SensorEven 值一同调用已注册监听器的 onSensorChanged()办法。这个 SensorEvent 值包含了 X/Y/Z 轴上的加速度值。

罗盘传感器

设备的磁场传感器和加速度计一同确定用户面向的方向

运用 SensorManager 的 getOrientation()得到用户在地球上的方向

5.从媒体内容得到截图的缩略图或其他元数据

MediaMetadataRetriever 读取媒体文件并回来有用的信息,能够读取和盯梢专辑或艺术家数据、或许内容数据本身,抓取该帧的截图

四。数据耐久化

1.存储、修改和显现用户设置及运用设置

PreferenceActivity 和 XML Preference 文件

2.读写文件

内部存储

受维护的用于读写文件数据的目录空间。

外部存储

外部挂载的用于读写文件数据的空间。

API Level 4 以上需求 WRITE_EXTERNAL_STORAGE 权限。一般都是设备的 SD 卡。

Assets

APK 中只读的受维护空间。用于放置不能/不该该被编译的本地资源。

3.共享数据

ContentProvider作为运用程序数据对外的接口,能够向外部恳求露出任何类型的运用程序数据,包含运用程序各种资源(包含 assets 下的资源)

五。与体系交互

1.告诉

经过一切的体系控件,如 Service、 BroadcastReceiver 或许 Activity,都能够将一个通

知发送到 NotificationManager。

Notification.Style展现更多的告诉款式

2.创立粘性操作

IntentService 会即将履行的使命(用 Intent表明)放到行列中,然后逐一处理每个恳求,全部处理完成后会终止自己。

3.启用其他运用程序

a。读取PDF文件

intent = new Intent(Intent.ACTION_VIEW);

intent.setDataAndType(file, "application/pdf");

b、与好友共享内容

Intent intent = new Intent(Intent.ACTION_SEND);

intent.setType("text/plain");

intent.putExtra(Intent.EXTRA_TEXT, update);

startActivity(Intent.createChooser(intent, "Share..."));

c。ShareActionProvider共享内容

依据用户运用习气,频频运用的选项会排到列表的最上方

android:showAsAction="ifRoom"

android:title="Share"

android:actionProviderClass="android.widget.ShareActionProvider"/>

MenuItem item = menu.findItem(R.id.menu_share);

ShareActionProvider provider = (ShareActionProvider) item.getActionProvider();

4.发动体系运用程序

a。浏览器

pageIntent.setAction(Intent.ACTION_VIEW);

pageIntent.setData(Uri.parse(“ http://WEB\_ADDRESS\_TO\_VIEW” ));

b。电话拨号器

dialIntent.setAction(Intent.ACTION_DIAL);

dialIntent.setData(Uri.Parse(“ tel:8885551234” );

c。地图

mapIntent.setAction(Intent.ACTION_VIEW);

mapIntent.setData(Uri.parse(“ geo:latitude,longitude” ));

d。电子邮件

mailIntent.setAction(Intent.ACTION_SEND);

mailIntent.setType(“ message/rfc822” );

mailIntent.putExtra(Intent.EXTRA_EMAIL, new String[] {"recipient@gmail.com"}); 收件人

mailIntent.putExtra(Intent.EXTRA_CC, new String[] {"carbon@gmail.com"}); 抄送

mailIntent.putExtra(Intent.EXTRA_BCC, new String[] {"blind@gmail.com"}); 密件抄送

mailIntent.putExtra(Intent.EXTRA_SUBJECT, "Email Subject");

mailIntent.putExtra(Intent.EXTRA_TEXT, "Body Text");

mailIntent.putExtra(Intent.EXTRA_STREAM, URI_TO_FILE); 附件

e、短音讯

smsIntent.setAction(Intent.ACTION_VIEW);

smsIntent.setType(“ vnd.android-dir/mms-sms” );

smsIntent.putExtra(“ address” , “ 8885551234” );

smsIntent.putExtra(“ sms_body” , “ Body Text” );

f。联系人挑选器

pickIntent.setAction(Intent.ACTION_PICK);

pickIntent.setData(URI_TO_CONTACT_TABLE);

g。Google Play

marketIntent.setAction(Intent.ACTION_VIEW);

marketIntent.setData(Uri.parse(“ market://details?id=PACKAGE_NAME_HERE” ));

六。Android NDK和Renderscript

七。运用程序规划指南

1.规划经过滤的运用程序

2.规划高性能的运用程序

优化代码结构、少创立方针、减少浮点运算、运用 System.arraycopy()复制、

运用扩大版的循环(比方 for (Strings: strings) {})

3.规划快速呼应的运用程序

留意运用线程

4.规划无缝衔接的运用程序

不要丢掉数据,不要供给原始数据,发送告诉、用线程履行长时间操作、防止ANR、扩展体系主题、规划运用多种分辨率的用户界面、留意网络判别、不要指定键盘布局、节约用电。

5.规划安全的运用程序