如何在xamarin跨平台应用程序中使用Web Api

2023-12-28

我创建了从 SQL 数据库检索数据的 Web api。我需要在适用于 Android 的 xamrin 和适用于 iOS 的 xamarin 中使用 Web api。截至目前,适用于 Android 的 Xamarin。我不知道如何根据按钮单击事件调用 GET 和 Post 方法。

这是网络 API

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;

namespace MvcAppDept.Controllers
{
public class DeptController : ApiController
{
    // GET api/values
    public IEnumerable<Dept> Get()
    {
        AndroidAppDBEntities db = new AndroidAppDBEntities();
        var data = from dept in db.Depts orderby dept.no select dept;
        return data.ToList();
    }

    // GET api/values/5
    public Dept Get(int id)
    {
        AndroidAppDBEntities db = new AndroidAppDBEntities();
        var data = from dept in db.Depts where dept.no == id select dept;
        return data.SingleOrDefault();
    }

    // POST api/values
    public void Post(Dept obj)
    {
        AndroidAppDBEntities db = new AndroidAppDBEntities();
        db.Depts.Add(obj);
        db.SaveChanges();
    }

    // PUT api/values/5
    public void Put(int id,Dept obj)
    {
        AndroidAppDBEntities db = new AndroidAppDBEntities();
        var data = from dept in db.Depts where dept.no == id select dept;
        Dept old = data.SingleOrDefault();
        old.no = obj.no;
        old.name = obj.name;
        db.SaveChanges();
    }

    // DELETE api/values/5
    public void Delete(int id)
    {
        AndroidAppDBEntities db = new AndroidAppDBEntities();
        var data = from dept in db.Depts where dept.no == id select dept;
        Dept obj = data.SingleOrDefault();
        db.Depts.Remove(obj);
        db.SaveChanges();

    }
 }
}


Global.asax.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Http;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;

 namespace MvcAppDept
{


public class WebApiApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();

        WebApiConfig.Register(GlobalConfiguration.Configuration);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
        GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear();


    }
   }

}

MainActivity.cs

using System;
using System.Net.Http;
using System.Threading.Tasks;
using Android.App;
using Android.Content;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.OS;
namespace DeptAndroidApp
{
    [Activity(Label = "DeptAndroidApp", MainLauncher = true, Icon = "@drawable/icon")]
    public class MainActivity : Activity
    {


        protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);
            SetContentView(Resource.Layout.Main);
            Button GetButton = FindViewById<Button>(Resource.Id.GetButton);
            var txtValue1 = FindViewById<EditText>(Resource.Id.txtValue1);
            int id = Convert.ToInt32(txtValue1.Text);
            var No = FindViewById<TextView>(Resource.Id.No);
            var Name = FindViewById<TextView>(Resource.Id.Name);
            //GetButton.Click += GetDept(id); 
            GetButton.Click+=async(sender,args)=>{
           //error  Cannot await 'DeptAndroidApp.dept                  
           Dept dept=await GetDept(id);
                No.Text=dept.No;
                Name.Text=dept.name}
        }
        //Error The return type ofasync method must be void,task orTask<T>
        public async Dept GetDept(int id)
        {
            using (var client = new HttpClient())
            {
                client.BaseAddress = new Uri("http://****.***/");
                client.DefaultRequestHeaders.Accept.Clear();
                client.DefaultRequestHeaders.Accept.Add(new               System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
                var result= await client.GetAsync(string.Format("/api/dept/{0}",id));
               return JsonConvert.DeserializeObject<Dept>(await result.Content.ReadAsStringAsync());                }       
        }

    }
}

以下是我如何在几乎任何项目(包括 Xamarin 项目)中使用此服务。

首先,删除 Global.asax 文件中这样的行:

GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear();

一般来说,这是不好的做法。您至少希望有可用的 XML 和 JSON 格式化程序,因为在宁静的环境中,由消费者决定他们需要/想要什么类型的序列化。

接下来,我将使用System.Net.Http.HttpClient与此服务交互的类。

从此时起,与 Web Api 服务进行交互就相当简单了。这里有些例子。

public async List<Dept> GetDepts()
{
     using(var client = new HttpClient())
     {
          client.BaseAddress = new Uri("http://<ipAddress:port>/");
          client.DefaultRequestHeaders.Accept.Clear();
          client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

          return await client.GetAsync("/api/dept");
     }
}

public async Task<Dept> GetDept(int id)
{
     using(var client = new HttpClient())
     {
          client.BaseAddress = new Uri("http://<ipAddress:port>/");
          client.DefaultRequestHeaders.Accept.Clear();
          client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

          var result = await client.GetAsync(string.format("/api/dept/{0}", id));

          return JsonConvert.DeserializeObject<Dept>(await result.Content.ReadAsStringAsync());
     }
}

public async Task AddDept(Dept dept)
{
     using(var client = new HttpClient())
     {
          client.BaseAddress = new Uri("http://<ipAddress:port>/");

          await client.PostAsJsonAsync("/api/dept", dept);
     }
}

public async Task UpdateDept(Dept dept)
{
     using(var client = new HttpClient())
     {
          client.BaseAddress = new Uri("http://<ipAddress:port>/");

          await client.PutAsJsonAsync(string.format("/api/dept/{0}", dept.no), dept);
     }
}

public async Task DeleteDept(int id)
{
     using(var client = new HttpClient())
     {
          client.BaseAddress = new Uri("http://<ipAddress:port>/");

          client.DeleteAsync(string.format("/api/dept/{0}", id));
     }
}

无论如何,这应该能让你朝着正确的方向开始。这绝对可以得到清理,而且是我徒手写的,所以可能会有一些拼写错误。

Update

更新您的 MainActivity.cs

代替int id = Convert.ToInt32(txtValue1)

Use

int id = Convert.ToInt32(txtValue1.Text);

代替GetButton.Click += GetDept(id);

Use

GetButton.Click += async (sender, args) => {
   var dept = await GetDept(id);

   No.Text = dept.no;
   Name.Text = dept.name
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在xamarin跨平台应用程序中使用Web Api 的相关文章

  • Android 中用虚拟键盘捕捉按键按下的情况?

    使用物理键盘 您可以使用按键监听器 http developer android com reference android text method KeyListener html 就像是 myEditText setOnKeyListe
  • 使用库来维护免费/付费的应用程序版本

    维护免费 付费应用程序版本的共识似乎是使用库 并从每个活动中设置一个标志 以从代码库中获取不同的功能 这有多安全 据我了解 一个人可以root他们的手机 获取APK 并且可以对其进行反编译 即使代码被混淆 也不难看出该应用程序是带有标志的包
  • 有没有办法以编程方式访问 Google 的搜索引擎结果? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 谷歌是否提供了一种以编程方式查看特定查询的搜索引擎结果的方法 我想构建一个跟踪应用程序 以便用户可以看
  • Firebase 数据库快速入门处理计数的方式安全吗?

    我想为文章点赞创建一个增量字段 我指的是这个链接 https firebase google com docs database android save data save data as transactions https fireb
  • 使用 android AudioTrack 在左或右扬声器中播放声音

    我正在应用程序中的 AudioTrack 的帮助下播放声音 但我想在特定扬声器 耳朵中播放声音 即左扬声器或右扬声器或两个扬声器 以下代码是我用来播放声音的 private AudioTrack generateTone double fr
  • android webview 函数 onPagefinished 被调用两次

    我的android webview功能onPageFinished被调用两次 我不知道为什么 但它在 android 2 2 上运行良好 但当我将其升级到 4 时 它就不起作用了 代码附在下面 Code Override public vo
  • 使用 RecyclerView 适配器在运行时更改布局屏幕

    我有两个布局文件 如下所示 如果列表中存在数据 则我显示此布局 当列表为空时 我会显示此布局 现在我想在运行时更改布局 当用户从列表中删除最后一项时 我想将布局更改为第二张图片中显示的 空购物车布局 In getItemCount Recy
  • 如何从一个代码库创建多个 Android 应用

    我有一个 Android 代码库 它使用带有设置的 API 来获取多个应用程序的不同数据 所有应用程序都使用相同的代码库 但进行一两个设计调整 那么如何重用主代码库而不必每次都复制整个 Android 项目呢 iPhone 在同一个项目中使
  • Android 应用被 Google Play 拒绝

    我最近向 Google Play 商店提交了一个 Android 应用程序 但收到一条消息说我的应用程序已被拒绝 我不确定问题是什么 也找不到确切的解决方案 拒绝原因 违反了禁止行为条款 内容政策 经过定期审核后 我们确定您的应用程序支持
  • Firestore - RecycleView - 图像持有者

    我不知道如何编写图像的支架 我已经设置了 2 个文本 但我不知道图像的支架应该是什么样子 你能帮我告诉我图像的文字应该是什么样子才能正确显示吗 holder artistImage setImageResource model getArt
  • 如何将 android.net.Uri 转换为 java.net.URL? [复制]

    这个问题在这里已经有答案了 有没有办法从Uri to URL 我正在使用的库需要这个 它only接受一个URL但我需要在我的设备上使用图像 如果该方案的Uri is http or https new URL uri toString 应该
  • 如何以xamarin形式使用消息中心

    我正在尝试使用消息中心而不是 xamarin 表单中的 Messenger 我不知道消息中心 我尝试使用以下代码以 xamarin 表单订阅和发送消息 MessagingCenter Send this TodoTable Todo 但我不
  • 如何在 Android NDK 中创建新的 NativeWindow 而无需 Android 操作系统源代码?

    我想编译一个 Android OpenGL 控制台应用程序 您可以直接从控制台启动 Android x86 运行 或者从 Android x86 GUI 内的 Android 终端应用程序运行 这个帖子 如何在 Android NDK 中创
  • Android Studio - 值必须 ≥ 0

    我在 Android Studio 中收到与光标有关的错误 我的代码中有以下行 String data cursor getString cursor getColumnIndex columnIndex columnIndex 被传递到该
  • onClick 未在带有子项的 LinearLayout 上触发

    我有一个自定义的 LinearLayout 和一个较小的 TextView 子级 我希望能够单击 TextView 未覆盖的区域 因此我将 clickable true 和 onclicklistener 设置为 LinearLayout
  • Android - 如何更改 TimePicker 中的文本颜色?

    我正在使用 TimePicker 到 LinearLayout 中 背景颜色 黑色 但是 我看不到 TimePicker 中的数字 并且我需要在布局中将背景颜色设置为黑色 如何更改 TimePicker 中的 textColor 我已经尝试
  • Espresso 和 Proguard 的 Java.lang.NoClassDefFoundError

    我对 Espresso 不太有经验 但我终于成功地运行了它 我有一个应用程序需要通过 Proguard 缩小才能处于 56K 方法之下 该应用程序以 3 秒的动画开始 因此我需要等到该动画结束才能继续 这就是我尝试用该方法做的事情waitF
  • onBackPressed 隐藏 不破坏 Activity

    我知道如何取消后退按键 以便活动 主窗口保持可见 public void onBackPressed return 我的目标是隐藏该活动 但是 在没有完成它的情况下 您如何在 onBackPressed 事件中做到这一点 即我想达到 onP
  • 按字母顺序过滤 Firestore 数据以对 Google Cloud 中的文档读取进行分类/减少

    基于这样的事实Cloud Firestore 不支持全文搜索 https firebase google com docs firestore solutions search到目前为止 我决定问这个question https stack
  • Android 自定义警报对话框中的 OnClickListener

    我是一个自学成才的初学者 感谢耐心 谢谢 在 Eclipse 中 我使用自己的 xml 文件 custom dialog 创建了一个自定义警报对话框 称为 usernamealert 如果用户尚未输入用户名 即 username lengt

随机推荐

  • 在jenkins管道脚本中获取gradle变量

    我正在尝试使用 groovy 构建脚本将构建管道迁移到 管道插件 我的管道通常是 测试 等级 集成测试 gradle 构建 等级 发布 人工 我想在我的 jenkins 构建脚本中使用版本 组等 gradle 变量来发布到神器中的正确文件夹
  • 如何在 Windows 上以编程方式触发 Flip 3D?

    如何在 Windows Vista 和 7 上以编程方式触发 Flip 3D 是否有相关的 API 如果有 它叫什么 在哪里可以找到相关函数 我需要一个具体的答案 例如指向实际功能的网络链接 而不是像 哦 它在 DirectX 中 这样的通
  • 如何在Excel中复制范围,然后使用宏调整大小并粘贴到Word中

    Sub CopyToWord Dim objWord As New Word Application copying the range that I want to paste in Word With ThisWorkbook Work
  • 从命令行参数将十六进制转换为二进制 C

    这是一项家庭作业 当在终端中调用命令时 我必须将十六进制转换为二进制 我的 老师 并没有真正 教 C 所以我完全迷失了 我必须包含一个过程 void printBits unsigned long i 用于打印 i 中的位 它将使用 p 开
  • getter/setter VS 公共变量的好处?

    使用有什么好处 private var someProp String public function set someProp value String void someProp value public function get so
  • 如何在Qt中显示选定的日期和数字

    我目前正在使用 QCalendarWidget 我需要一些想法来完成以下任务 将 QCalendarWidget 中的 selecteDate 和数字添加到某种表格中的最佳方法是什么 我想要的基本上是一个日期列表 每个日期都附有一个数字 这
  • strcmp 将无法在 if 语句中正确计算[重复]

    这个问题在这里已经有答案了 include
  • 获取函数的默认值?

    有没有办法在 JavaScript 中检索函数的默认参数值 function foo x 5 things I do not control 有没有办法获得默认值x这里 最好是这样的 getDefaultValues foo x 5 注意t
  • 如何让两个下拉列表并排显示?

    我一直在尝试使两个下拉列表并排显示 但无法弄清楚 要设置什么 CSS 元素属性来执行此操作 我必须以以下格式显示它 company mobile 代替 company mobile 这样的对有 3 对 此外 这对 2 个选择下拉框似乎并不遵
  • sql if语句检查空参数

    我正在尝试传递一个参数 如果该参数为空 我想将县 ID 设置为其自身 如果县 ID 不为空 那么我想带回县协作中所有县的记录 我收到错误的语法错误 关于如何做到这一点有什么想法吗 DECLARE pCountyId as int selec
  • Java中能否限制输入只能输入数字或者只能输入一定数量的数字? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 在 Java 中 您可以将使用扫描仪的输入限制为只能输入某些类型 例如数字或字母 另外 您可以将输入限制为可以输入的一定数量的字符吗
  • Java:将秒输入转换为小时/分钟/秒

    这是一个练习题 摘自Java 软件解决方案 程序设计的基础作者 Lewis Loftus 第 4 版 问题 PP2 6 这是一个link http mimoza marmara edu tr odemir Java 20Software 2
  • R DataFrame 中的集合

    我有一个 csv 看起来像 Deamon Host 1 2 4 aaa 03 Pixe Paradigm 1 3 5 11 us 我需要将其读入数据帧中进行分析 但数据中的第三列由 分隔 并且需要像由 分割的集合或列表 1 e 一样读取 以
  • 为什么受保护的访问修饰符与静态一起使用时与与非静态一起使用时的工作方式不同

    通常 当我们对类中的字段使用 protected 时 由于子类位于不同的包中 因此其子类无法使用基类的引用来访问它 那是真实的 但我发现当 field 添加 static 关键字时 它的行为有所不同 它变得触手可及 这怎么可能 有谁有答案吗
  • JTable 中的日期排序无效

    请看下面的代码 import java awt import java awt event import java text NumberFormat import java text ParseException import java
  • 使用和串流

    我调用 Soap 扩展中的方法来解密和验证 Soap 消息 我有这样的课程 我有一个类 它解密并验证签名 Soap 消息 它在 Soap 扩展类中返回流 方法 DecryptAndVerifySingXml 和 GetGuid 使用类肥皂扩
  • 雅虎电影 API 文档 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在尝试使用新的未发布的 Yahoo Movies API 但找不到任何有关它的官方或非官方文档 有
  • C# 如何检查当前字符串的日期是否是今天?

    我有一个格式为 字符串 通用时间 的日期 请参阅MSDN 链接在这里 http msdn microsoft com en us library ms684436 28VS 85 29 aspx 我需要检查这个日期是否是今天以及是否是 do
  • C 中数组的数组,其中数组的长度不同

    我知道你可以轻松地制作一个固定长度的矩阵 double m 2 但是 我想要一个数组数据结构 其中存储具有不同长度的双精度类型数组 我怎么做 一个例子是 arr1 1 2 3 4 arr2 1 2 锯齿状阵列 https en wikipe
  • 如何在xamarin跨平台应用程序中使用Web Api

    我创建了从 SQL 数据库检索数据的 Web api 我需要在适用于 Android 的 xamrin 和适用于 iOS 的 xamarin 中使用 Web api 截至目前 适用于 Android 的 Xamarin 我不知道如何根据按钮