Xamarin只言片语2——Xamarin下的web api操作

在很多时候,我们是希望手机app是要和服务端关联,并获取服务端的数据的,本篇博文我们看一下在xmarin下,怎么和用web api的方式与服务端连接并获取数据。

首先看web api的开发,本实例是用Visual Studio 2013 with update 4开发


wKiom1UFB66AkX0YAAMS-_7_ELk270.jpg

wKioL1UFCNPgPUd3AAJGLrt5OVM185.jpg


然后创建一个实体类City

public class City

 {

     public int Code

     { getset; }

     public string Name

     { getset; }

 }

再创建一个WebApiController

    [RoutePrefix("api")]

public class TestController : ApiController

{

    [HttpGet]

    [Route("citys")]//通过路由设计为citys

    public IHttpActionResult GetCitys()

    {

        var citys = new List<City>() {

        new City(){ Code=1,Name="北京"},

        new City(){Code=2,Name="天津"}

        };

        return Json(citys);//通过Json方式返回数据

    }

 

    [HttpPost]//设定请求方式为get请求

    [Route("login")]//通过路由设计为citys

    public IHttpActionResult SaveUser(string UserName, string Password)

    {

        if (UserName == "aaa" && Password == "bbb")

        {

            return Ok(1);

        }

        else

        {

            return Ok(0);

        }

    }

}

并键一点是要把webapi项目布署到IIS上,本例访问地址是:http://192.168.1.106/api

Android

创建一个Android的空项目。

wKiom1UFB_WAOpxSAAM3oRHZlwM169.jpg

右击项目,“管理Nuget程序包”,查Restsharp for Android,并安装

wKioL1UFCT_SSdxdAARS1JxKTXo273.jpg

wKiom1UFCE6zxfMnAACUStJmqd8474.jpg

新建一个窗体,axml如下:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:orientation="vertical"

    android:layout_width="fill_parent"

    android:layout_height="fill_parent">

    <Button

        android:text="确定"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:id="@+id/But1" />

    <EditText

        android:inputType="textMultiLine"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:id="@+id/username" />

    <EditText

        android:inputType="textMultiLine"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:id="@+id/password" />

    <Button

        android:text="确定"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:id="@+id/But2" />

</LinearLayout>

后端代码如下:

using System;

using Android.App;

using Android.Content;

using Android.Runtime;

using Android.Views;

using Android.Widget;

using Android.OS;

using RestSharp;

using System.Net;

using System.Collections.Generic; 

namespace WebApiAndroid

{

    [Activity(Label = "WebApiAndroid", MainLauncher = true, Icon = "@drawable/icon")]

    public class MainActivity : Activity

    {

        protected override void OnCreate(Bundle bundle)

        {

            base.OnCreate(bundle); 

            SetContentView(Resource.Layout.Main); 

            Button but1 = FindViewById<Button>(Resource.Id.But1);

            Button but2 = FindViewById<Button>(Resource.Id.But2);

            EditText username_et = FindViewById<EditText>(Resource.Id.username);

            EditText password_et = FindViewById<EditText>(Resource.Id.password);

            but1.Click += delegate

            {

                RestClient client = new RestClient(@"http://192.168.1.106/api/");

                RestRequest request = new RestRequest(@"citys"Method.GET);

                client.ExecuteAsync(request, resp =>

                {

                    if (resp.StatusCode == HttpStatusCode.OK)

                    {

                        var v = resp.Content;

                        var citys = SimpleJson.DeserializeObject<List<City>>(v);

                        RunOnUiThread(() => Toast.MakeText(this"获取成功!" + citys.Count, ToastLength.Short).Show());

                    }

                    else

                    {

                        RunOnUiThread(() => Toast.MakeText(this"获取失败:" + resp.StatusCode.ToString(), ToastLength.Short).Show());

                    }

                }); 

            }; 

            but2.Click += delegate

            {

                RestClient client = new RestClient(@"http://192.168.1.106/api/");

                RestRequest request = new RestRequest(@"login"Method.POST);

                //输入参数

                request.AddParameter("UserName", username_et.Text, ParameterType.QueryString);

                request.AddParameter("Password", password_et.Text, ParameterType.QueryString);

                //上传结果回调函数

                client.ExecuteAsync(request, resp =>

                {

                    if (resp.StatusCode == HttpStatusCode.OK)

                    {

                        var v = resp.Content;

                        if (v == "1")

                        {

                            RunOnUiThread(() => Toast.MakeText(this"登录成功"ToastLength.Short).Show());

                        }

                        else

                        {

                            RunOnUiThread(() => Toast.MakeText(this"登录失败:" + resp.StatusCode.ToString(), ToastLength.Short).Show());

                        }

                    }

                    else

                    {

                        RunOnUiThread(() => Toast.MakeText(this"获取失败:" + resp.StatusCode.ToString(), ToastLength.Short).Show());

                    }

                }); 

            };

        }

    } 

    public class City

    {

        public int Code

        { getset; } 

        public string Name

        { getset; } 

    }

}

wKiom1UFCL6AvGeTAAHo2Wf5aMc476.jpg

wKioL1UFCeOwuV4AAAH6ZJlU_2g591.jpg

IPhone

对于IOS开发,也是同样的,在Visual Studio中新建一个IPhone的应用。

wKiom1UFCRWSZ9BhAANacAkFI70549.jpg

这时要求连接一Mac作为Build Host

wKiom1UFCVXi45JtAAH9p4oQ3ks814.jpg

这里我设置的是我的mac系统

wKioL1UFCrDBnt4AAAG1wJYqMlg784.jpg

同时打开Mac上的xamarin.ios build host,开始配对

wKioL1UFCujzXqRvAAI-WNEkCnA316.jpg

在开发端输入mac端生成的pin

wKioL1UFCxXRWZpXAAE3ZdGK35g313.jpg

开始配对,这里要注意你的visual studio所在的windows要与 build host所在的mac处于同一个局域网内。

 

右键IOS项目,打开nuget,安装Restsharp for ios

wKioL1UFCzfxO02lAASkY9w7eFc413.jpg

还有另一个办法来添加RestSharp引用,打开下面网址

https://github.com/restsharp/RestSharp

下载程序包

wKiom1UFCkaBkGVsAAQhSMaoSYY452.jpg

重新编译RestSharp.IOS,并把bin目录中生成(最好是Release)RestSharp.IOS.dll引用到当前的IOS项目中。

打开IOS项目中的MainStoryboard.storyboard,添加两个按钮MyBut1MyBut2,和两个文本框,分别是UserName_TBPassword_TB

wKiom1UFCnmSn_u0AABoEHySc-g670.jpg

后台Controller中的代码如下:

using System;

using System.Drawing; 

using Foundation;

using UIKit;

using RestSharp;

using System.Net;

using System.Collections.Generic; 

namespace WebApiIPhone

{

    public partial class RootViewController : UIViewController

    {

        public RootViewController(IntPtr handle)

            : base(handle)

        {

        } 

        public override void DidReceiveMemoryWarning()

        {

            base.DidReceiveMemoryWarning();

        } 

        #region View lifecycle 

        public override void ViewDidLoad()

        {

            base.ViewDidLoad(); 

            MyBut1.TouchUpInside += MyBut1_TouchUpInside;

            MyBut2.TouchUpInside += MyBut2_TouchUpInside;

        }

 

        void MyBut2_TouchUpInside(object sender, EventArgs e)

        {

            RestClient client = new RestClient(@"http://192.168.1.106/api/");

            RestRequest request = new RestRequest(@"login"Method.POST);

            //输入参数

            request.AddParameter("UserName", UserName_TB.Text, ParameterType.QueryString);

            request.AddParameter("Password", Password_TB.Text, ParameterType.QueryString);

            //上传结果回调函数

            client.ExecuteAsync(request, resp =>

            {

                if (resp.StatusCode == HttpStatusCode.OK)

                {

                    var v = resp.Content;

                    if (v == "1")

                    {

                        InvokeOnMainThread(delegate

                            {

                                var alert = new UIAlertView("提示""登录成功:"new AlertDelegate(), "确定");

                                alert.Show();

                            });

                    }

                    else

                    {

                        InvokeOnMainThread(delegate

                            {

                                var alert = new UIAlertView("提示""登录失败:"new AlertDelegate(), "确定");

                                alert.Show();

                            });

                    }

                }

                else

                {

                    InvokeOnMainThread(delegate

                   {

                       var alert = new UIAlertView("提示""登录成功:" + resp.StatusCode.ToString(), new AlertDelegate(), "确定");

                       alert.Show();

                   }); 

                }

            });

        } 

        void MyBut1_TouchUpInside(object sender, EventArgs e)

        {

            RestClient client = new RestClient(@"http://192.168.1.106/api/");

            RestRequest request = new RestRequest(@"citys"Method.GET);

            client.ExecuteAsync(request, resp =>

            {

                if (resp.StatusCode == HttpStatusCode.OK)

                {

                    var v = resp.Content;

                    var citys = SimpleJson.DeserializeObject<List<City>>(v);

 

                    InvokeOnMainThread(delegate

                    {

                        var alert = new UIAlertView("提示""获取成功:" + citys.Count, new AlertDelegate(), "确定");

                        alert.Show();

                    }); 

                }

                else

                {

                    InvokeOnMainThread(delegate

                    {

                        var alert = new UIAlertView("提示""获取失败!"new AlertDelegate(), "确定");

                        alert.Show();

                    });

                }

            }); 

        } 

        public override void ViewWillAppear(bool animated)

        {

            base.ViewWillAppear(animated);

        } 

        public override void ViewDidAppear(bool animated)

        {

            base.ViewDidAppear(animated);

        } 

        public override void ViewWillDisappear(bool animated)

        {

            base.ViewWillDisappear(animated);

        } 

        public override void ViewDidDisappear(bool animated)

        {

            base.ViewDidDisappear(animated);

        } 

        #endregion 

        public class AlertDelegate : UIAlertViewDelegate

        {

            public override void Clicked(UIAlertView alertview, nint buttonIndex)

            {

                if (buttonIndex == 0)

                {

                    //确定处理代码

                }

                else

                {

                    //取消处理代码

                }

            }

        } 

    } 

    public class City

    {

        public int Code

        { getset; }

        public string Name

        { getset; } 

    }

}

这时你会发现,AndroidIOS中的请求RestSharp的代码是一致的。

效果如下:

wKiom1UFCu7SwIaAAAEmsaBXUiI156.jpg

wKioL1UFDBPhmF0eAAElFt8MYqU546.jpg

wKiom1UFCu-QEA6HAAElcruJ_JQ663.jpg

Demo下载

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/545127.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

求求你,别再用wait和notify了!

作者 | 王磊来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;Condition 是 JDK 1.5 中提供的用来替代 wait 和 notify 的线程通讯方法&#xff0c;那么一定会有人问&#xff1a;为什么不…

JavaScript--变量、作用域及内存(12)

// JS变量是松散型的(不强制类型)本质,决定了它只是在特定时间用于保存特定值的一个名字而已; // 由于不存在定义某个变量必须要保存何种数据类型值的规则,变量的值及其数据类型可以在脚本的生命周期内改变; 一 变量及作用域 1.基本类型和引用类型 1 // JS变量包含两种不同的数…

查看MYSQL数据库中所有用户及拥有权限

查看MYSQL数据库中所有用户mysql> SELECT DISTINCT CONCAT(User: ,user,,host,;) AS query FROM mysql.user; --------------------------------------- | query | --------------------------------------- | User: cactiuser%; …

c ++类成员函数_C ++编程中的数据成员和成员函数

c 类成员函数C 中的数据成员和成员函数 (Data members and Member functions in C) "Data Member" and "Member Functions" are the new names/terms for the members of a class, which are introduced in C programming language. “数据成员”和“成员函…

一文学搞懂阿里开源的微服务新贵Nacos!

正式开始之前我们先来了解一下什么是 Nacos&#xff1f;Nacos 是阿里的一个开源产品&#xff0c;它是针对微服务架构中的 「服务发现」、「配置管理」、「服务治理」的综合性解决方案。官网给出的回答&#xff1a;“Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组…

ntfs安全权限和共享权限的区别

ntfs安全权限和共享权限的区别 win xp 最大分区32G,最大文件大小4G. 共享权限是为网络用户设置的&#xff0c;NTFS权限是对文件夹设置的。用户对文件夹有什么权限就是看NTFS权限的设置。如果一个文件夹设置成共享&#xff0c;其具体的权限还是在NTFS权限上面设置的&#xff0c;…

The connection to adb is down, and a severe error has occured.

转自&#xff1a;http://blog.csdn.net/yu413854285/article/details/7559333 &#xff08;感谢原文作者&#xff0c;问题解决&#xff09; 启动android模拟器时.有时会报The connection to adb is down, and a severe error has occured.的错误.在网友说在任务管理器上把所有…

kotlin 16进制_Kotlin程序将八进制数转换为十进制数

kotlin 16进制Given a number in octal number system format, we have to convert it into decimal number system format. 给定八进制系统格式的数字&#xff0c;我们必须将其转换为十进制系统格式。 Example: 例&#xff1a; Input:num 344Output:228在Kotlin中将八进制数…

线程池的7种创建方式,强烈推荐你用它...

作者 | 王磊来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;根据摩尔定律所说&#xff1a;集成电路上可容纳的晶体管数量每 18 个月翻一番&#xff0c;因此 CPU 上的晶体管数量会越来越…

SQL调用C# dll(第一中DLL,没使用强名称密匙,默认是 safe)

https://msdn.microsoft.com/zh-cn/library/ms345106(es-es).aspx 1、新建项目名称SQLDllTest&#xff0c;类代码如下&#xff0c;没有用Using引用其他类&#xff1a; &#xff08;框架必须改为.NET3.5及3.5以下&#xff0c;因为SQL Server 2008只是支持.NET 3.5及一下&#xf…

Linux系统下启动MySQL的命令及相关知识

一、总结一下&#xff1a; 1.Linux系统下启动MySQL的命令&#xff1a; /ect/init.d/mysql start (前面为mysql的安装路径) 2.linux下重启mysql的命令&#xff1a; /ect/init.d/mysql restart (前面为mysql的安装路径) 3.linux下关闭mysql的命令&#xff1a; /ect/init.d/mysql …

线性代数向量乘法_标量乘法属性1 | 使用Python的线性代数

线性代数向量乘法Prerequisite: Linear Algebra | Defining a Vector 先决条件&#xff1a; 线性代数| 定义向量 Linear algebra is the branch of mathematics concerning linear equations by using vector spaces and through matrices. In other words, a vector is a mat…

Synchronized 的 8 种使用场景!

blog.csdn.net/x541211190/article/details/106272922简介本文将介绍8种同步方法的访问场景&#xff0c;我们来看看这8种情况下&#xff0c;多线程访问同步方法是否还是线程安全的。这些场景是多线程编程中经常遇到的&#xff0c;而且也是面试时高频被问到的问题&#xff0c;所…

Python的threadpool模块

2019独角兽企业重金招聘Python工程师标准>>> Python的threadpool模块 这是一个使用python实现的线程池库。 安装 pip install threadpool 文档 http://gashero.yeax.com/?p44 http://www.chrisarndt.de/projects/threadpool/ 测试 使用一个20个线程的线程池进行测试…

MySql常用命令总结

1:使用SHOW语句找出在服务器上当前存在什么数据库&#xff1a;mysql> SHOW DATABASES;2:2、创建一个数据库MYSQLDATAmysql> CREATE DATABASE MYSQLDATA;3:选择你所创建的数据库mysql> USE MYSQLDATA; (按回车键出现Database changed 时说明操作成功&#xff01;)4:查看…

硬核Redis总结,看这篇就够了!

高清思维导图已同步Git&#xff1a;https://github.com/SoWhat1412/xmindfile总感觉哪里不对&#xff0c;但是又说不上来1、基本类型及底层实现1.1、String用途&#xff1a;适用于简单key-value存储、setnx key value实现分布式锁、计数器(原子性)、分布式全局唯一ID。底层&…

sql 数字减去null_减去两个16位数字| 8086微处理器

sql 数字减去nullProblem: Write a program to subtract two 16-bit numbers where starting address is 2000 and the numbers are at 3000 and 3002 memory address and store result into 3004 and 3006 memory address. 问题&#xff1a;编写一个程序以减去两个16位数字(起…

Java 解决采集UTF-8网页空格变成问号乱码

http://blog.csdn.net/bob007/article/details/27098875 使用此方法转换后&#xff0c;在列表中看到的正常&#xff0c;但是在详情页的文本框中查看到的就是 了&#xff0c;只好过滤掉所有的空格 html html.replaceAll(UTFSpace, " ");改为html html.replaceAll(UT…

linux中如何改IP

修改IP永久生效按以下方法vi /etc/sysconfig/network-scripts/ifcfg-eth0&#xff08;eth0&#xff0c;第一块网卡&#xff0c;如果是第二块则为eth1&#xff09;按如下修改ipDEVICEeth0&#xff08;如果是第二块刚为eth1&#xff09;BOOTPROTOstaticIPADDR192.168.0.11(改成要…

文件写入的6种方法,这种方法性能最好

作者 | 王磊来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;在 Java 中操作文件的方法本质上只有两种&#xff1a;字符流和字节流&#xff0c;而字节流和字符流的实现类又有很多&#x…