Xamarin.android Xamarin PCL,向REST服务发出请求并返回模型

Xamarin.android Xamarin PCL,向REST服务发出请求并返回模型,xamarin.android,xamarin,portable-class-library,Xamarin.android,Xamarin,Portable Class Library,因此,按照建议,我希望使用RestSharp来处理RESTWeb服务。我正在开发iOS和Android应用程序,我很想制作PCL,它向服务发出请求并只返回解析结果(例如,用户对象数组) 所以我如何在我的PCL中获得RestSharp,试过的NuGet,组件不适用于PCL,严重的问题是只下载源文件并在项目中复制它们,我想保留一些依赖关系管理 最佳做法是什么?我是否从错误的角度看待此问题?RestSharp不支持PCLs。我建议签出,或者只使用HttpClient和Json.NET的组合。我使用依赖

因此,按照建议,我希望使用RestSharp来处理RESTWeb服务。我正在开发iOS和Android应用程序,我很想制作PCL,它向服务发出请求并只返回解析结果(例如,用户对象数组)

所以我如何在我的PCL中获得RestSharp,试过的NuGet,组件不适用于PCL,严重的问题是只下载源文件并在项目中复制它们,我想保留一些依赖关系管理


最佳做法是什么?我是否从错误的角度看待此问题?

RestSharp不支持PCLs。我建议签出,或者只使用HttpClient和Json.NET的组合。

我使用依赖注入,以便支持非PCL Json解析器。我还计划尝试一下组件存储中的本机HttpClient包装器。通过使用非PCL代码,与Json.NET等相比,您将获得相当多的性能

文本库有序列化程序接口,Web有IRestClient


下面的修改对我来说很有用,如果你觉得合适,我会很高兴的。 尝试在PCL中使用modernhttpclient。在inAndroid项目中,请确保您拥有以下软件包

  • Microsoft.Bcl.Build
  • 微软公司
  • Microsoft.Net.Http
  • modernhttpclient
  • 与应用程序清单中所需权限下的权限一起,授予以下权限

  • 访问网络状态
  • 访问无线网络状态
  • 互联网

  • 理想情况下,当您尝试将Microsoft.Bcl添加到针对monoandroid的Android项目中时,它会抛出错误,因此请尝试按上述顺序添加nuget引用

    我开发了一个非常简单的REST客户端,可以轻松地执行Http请求。你可以在我的Github上查看。API非常简单:

    await new Request<T>()
    .SetHttpMethod(HttpMethod.[Post|Put|Get|Delete].Method) //Obligatory
    .SetEndpoint("http://www.yourserver.com/profilepic/") //Obligatory
    .SetJsonPayload(someJsonObject) //Optional if you're using Get or Delete, Obligatory if you're using Put or Post
    .OnSuccess((serverResponse) => { 
       //Optional action triggered when you have a succesful 200 response from the server
      //serverResponse is of type T
    })
    .OnNoInternetConnection(() =>
    {
        // Optional action triggered when you try to make a request without internet connetion
    })
    .OnRequestStarted(() =>
    {
        // Optional action triggered always as soon as we start making the request i.e. very useful when
        // We want to start an UI related action such as showing a ProgressBar or a Spinner.
    })
    .OnRequestCompleted(() =>
    {
        // Optional action triggered always when a request finishes, no matter if it finished successufully or
        // It failed. It's useful for when you need to finish some UI related action such as hiding a ProgressBar or
        // a Spinner.
    })
    .OnError((exception) =>
    {
        // Optional action triggered always when something went wrong it can be caused by a server-side error, for
        // example a internal server error or for something in the callbacks, for example a NullPointerException.
    })
    .OnHttpError((httpErrorStatus) =>
    {
        // Optional action triggered when something when sending a request, for example, the server returned a internal
        // server error, a bad request error, an unauthorize error, etc. The httpErrorStatus variable is the error code.
    })
    .OnBadRequest(() =>
    {
        // Optional action triggered when the server returned a bad request error.
    })
    .OnUnauthorize(() =>
    {
        // Optional action triggered when the server returned an unauthorize error.
    })
    .OnInternalServerError(() =>
    {
        // Optional action triggered when the server returned an internal server error.
    })
    //AND THERE'S A LOT MORE OF CALLBACKS THAT YOU CAN HOOK OF, CHECK THE REQUEST CLASS TO MORE INFO.
    .Start();
    
    等待新请求()
    .SetHttpMethod(HttpMethod.[Post | Put | Get | Delete].Method)//
    .SetEndpoint(“http://www.yourserver.com/profilepic///强制性
    .SetJsonPayload(someJsonObject)//如果使用Get或Delete,则为可选;如果使用Put或Post,则为强制性
    .OnSuccess((服务器响应)=>{
    //当您收到来自服务器的成功200响应时触发的可选操作
    //serverResponse的类型为T
    })
    .OnNoInternetConnection(()=>
    {
    //尝试在没有internet连接的情况下发出请求时触发的可选操作
    })
    .OnRequestStarted(()=>
    {
    //可选操作总是在我们开始提出请求时触发,即在以下情况下非常有用
    //我们希望启动与UI相关的操作,例如显示进度条或微调器。
    })
    .OnRequestCompleted(()=>
    {
    //无论请求是否成功完成,可选操作总是在请求完成时触发
    //它失败了。当您需要完成一些与UI相关的操作时,例如隐藏进度条或
    //纺纱机。
    })
    .OnError((例外)=>
    {
    //可选操作总是在出现错误时触发。例如,它可能是由服务器端错误引起的
    //例如,内部服务器错误或回调中的某些内容,例如NullPointerException。
    })
    .OnHttpError((httpErrorStatus)=>
    {
    //当发送请求时,服务器返回内部请求时,会触发可选操作
    //服务器错误、错误请求错误、未授权错误等。httpErrorStatus变量是错误代码。
    })
    .OnBadRequest(()=>
    {
    //服务器返回错误请求错误时触发的可选操作。
    })
    .OnUnauthorize(()=>
    {
    //服务器返回未授权错误时触发的可选操作。
    })
    .OnInternalServerError(()=>
    {
    //服务器返回内部服务器错误时触发的可选操作。
    })
    //还有更多的回调,您可以钩住它们,检查请求类以获取更多信息。
    .Start();
    
    这似乎是可行的解决方案/替代方案。因此我尝试了PortableRest的这种设置:一个Android项目和一个PCL项目。我将PortableRest与NuGet一起引用到PCL项目,将PCL项目引用到Android项目。但当我尝试构建它时,它说在Android项目中它找不到PortableRest,当我尝试初始化我的Clinet类时,它是从PortableRest中的RestClient继承的。如果我也将PortableRest引用到Anseois项目中,它说明了我在客户端构造函数中使用的TimeZoneInfo类的双重性。@ZdeněkTopič我建议发布另一个关于PortableRest问题的问题。你也可以在Xamarin跨平台论坛上发布,这听起来也很合理。将请求封装在每个平台上的某个容器中,并在PCL中处理结果。无法决定应该使用哪种建议的解决方案。