C# 如何在xamarin库/sdk中使用refit调用RESTAPI
我正在构建一个xamarin库/插件,该插件应该使用refit调用API,但当我调用API时,我得到以下错误:C# 如何在xamarin库/sdk中使用refit调用RESTAPI,c#,xamarin,xamarin.forms,xamarin.android,refit,C#,Xamarin,Xamarin.forms,Xamarin.android,Refit,我正在构建一个xamarin库/插件,该插件应该使用refit调用API,但当我调用API时,我得到以下错误: System.Net.Http.HttpRequestException: Connection refused ---> System.Net.Sockets.SocketException: Connection refused System.Net.Http.HttpRequestException: Connection refused ---> System.Ne
System.Net.Http.HttpRequestException: Connection refused ---> System.Net.Sockets.SocketException: Connection refused System.Net.Http.HttpRequestException: Connection refused ---> System.Net.Sockets.SocketException: Connection refused
at System.Net.Http.ConnectHelper.ConnectAsync (System.String host, System.Int32 port, System.Threading.CancellationToken cancellationToken) [0x00110] in <99e6bf9d99304315ba19eacc7497e256>:0
--- End of inner exception stack trace ---
at System.Net.Http.ConnectHelper.ConnectAsync (System.String host, System.Int32 port, System.Threading.CancellationToken cancellationToken) [0x001ac] in <99e6bf9d99304315ba19eacc7497e256>:0
at System.Threading.Tasks.ValueTask`1[TResult].get_Result () [0x0001b] in <6de48997d0c0445dbea8d4d83492d8c6>:0
at System.Net.Http.HttpConnectionPool.CreateConnectionAsync (System.Net.Http.HttpRequestMessage request, System.Threading.CancellationToken cancellationToken) [0x00134] in <99e6bf9d99304315ba19eacc7497e256>:0
at System.Threading.Tasks.ValueTask`1[TResult].get_Result () [0x0001b] in <6de48997d0c0445dbea8d4d83492d8c6>:0
System.Net.Http.HttpRequestException:拒绝连接---->System.Net.Sockets.SocketException:拒绝连接System.Net.Http.HttpRequestException:拒绝连接---->System.Net.Sockets.SocketException:拒绝连接
位于:0中的System.Net.Http.ConnectHelper.ConnectAsync(System.String主机、System.Int32端口、System.Threading.CancellationToken CancellationToken)[0x00110]
---内部异常堆栈跟踪的结束---
在System.Net.Http.ConnectHelper.ConnectAsync(System.String主机、System.Int32端口、System.Threading.CancellationToken CancellationToken)[0x001ac]中,位于:0
在System.Threading.Tasks.ValueTask`1[TResult].get_Result()[0x0001b]中:0
在:0中的System.Net.Http.HttpConnectionPool.CreateConnectionAsync(System.Net.Http.HttpRequestMessage请求,System.Threading.CancellationToken CancellationToken)[0x00134]处
在System.Threading.Tasks.ValueTask`1[TResult].get_Result()[0x0001b]中:0
我的Sdk代码:
接口
namespace Plugin.MySDK
{
public interface ISDK
{
[Post("/cart")]
Task<Events> postCart([Body] Events events);
}
}
namespace Plugin.MySDK
{
公共接口ISDK
{
[邮寄(“/购物车”)]
任务启动后([正文]事件);
}
}
我在MySDK.android.cs中调用api
namespace Plugin.MySDK
{
public class MySDK
{
static Activity currentActivity;
private static string _ms = "abcd";
private static string _appName;
private static string BASE_URL = "http://b80502ca.ngrok.io";
public TerraSDK()
{
}
public static void initialize(Activity activity,
string app)
{
currentActivity = activity;
_appName = app;
}
public static async void Cart()
{
try
{
var apiResponse = RestService.For<ISDK>(BASE_URL);
Events events = new Events();
events.ms = _ms;
events.app = _appName;
Events ev = await apiResponse.postCart(events);
Console.WriteLine("Response: " + ev);
}
catch (Exception ex)
{
Console.WriteLine("Cart:" + ex);
}
}
}
}
namespace Plugin.MySDK
{
公共类MySDK
{
静态活动电流活动;
私有静态字符串_ms=“abcd”;
私有静态字符串_appName;
私有静态字符串BASE_URL=”http://b80502ca.ngrok.io";
公共TerraSDK()
{
}
公共静态无效初始化(活动,
字符串应用程序)
{
当前活动=活动;
_appName=app;
}
公共静态异步void Cart()
{
尝试
{
var apiResponse=RestService.For(基本URL);
事件=新事件();
events.ms=_-ms;
events.app=\u appName;
事件ev=等待apiResponse.启动后(事件);
控制台写入线(“响应:+ev);
}
捕获(例外情况除外)
{
控制台写入线(“购物车:+ex”);
}
}
}
}
使用SDK:
namespace TestSdk.Droid
{
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
{
Button cart;
private static string _appName = "TestSdk";
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
this.SetContentView(Resource.Layout.Main);
Xamarin.Essentials.Platform.Init(this, savedInstanceState);
global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
LoadApplication(new App());
cart = FindViewById<Button>(Resource.Id.cart);
MySDK.initialize(this,_appName);
cart.Click += this.Message;
}
public void Message(object sender, EventArgs e)
{
MySDK.Cart();
}
public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
{
Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);
base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
}
}
}
namespace TestSdk.Droid
{
公共类MainActivity:全局::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
{
按钮车;
私有静态字符串\u appName=“TestSdk”;
创建时受保护的覆盖无效(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
this.SetContentView(Resource.Layout.Main);
Xamarin.Essentials.Platform.Init(这个,savedInstanceState);
全局::Xamarin.Forms.Forms.Init(这个,savedInstanceState);
加载应用程序(新应用程序());
cart=findviewbyd(Resource.Id.cart);
初始化(这个,_appName);
cart.Click+=此消息;
}
公共无效消息(对象发送方,事件参数e)
{
MySDK.Cart();
}
public override void OnRequestPermissionsResult(int-requestCode,string[]permissions,[GeneratedEnum]Android.Content.PM.Permission[]grantResults)
{
Xamarin.Essentials.Platform.OnRequestPermissionsResult(请求代码、权限、GrantResult);
base.OnRequestPermissionsResult(请求代码、权限、GrantResult);
}
}
}
但是,当我尝试从一个应用程序以同样的方式调用API时,一切都按预期进行。如果我做错了什么,请帮助并纠正我,我是xamarin的新手你在Android清单中启用了internet权限吗?是的,我在应用程序中调用了相同的api,它工作正常,但通过SDK调用时不起作用。这应该是防火墙的问题。你能用Android设备和模拟器在iOS设备和模拟器上复制这个问题吗?我能在Android设备上复制它。@Saamer