如何从可移植类库调用REST服务

本文关键字:调用 REST 服务 类库 可移植 | 更新日期: 2023-09-27 17:50:51

我的目标项目是Windows 8, WinRT和Windows Phone 8。我使用可移植类库作为解决方案,以便共享源代码。我需要调用在另一个MVC Web Api项目中创建的一些REST服务,但HttpClient类在PCL中不可用。哪个是解决它的好方法?我在考虑一个服务接口,然后为每个平台创建一个项目,在每种情况下使用HttpClient, WebClient或适当的类。这种方法可以工作,但我想知道是否有其他方法。

如何从可移植类库调用REST服务

微软已经将HttpClient库重写为可移植的(PCL),它在NuGet上。目前,它只能作为预发布版本使用,所以如果你正在使用NuGet GUI包管理器,请确保你设置为"包括预发布"。从命令行:

Install-Package Microsoft.Net.Http

从微软的角度来看,HttpClient不一定是可移植的。唯一的另一种方法是创建每个项目将实现的单独的库,并按照您所描述的进行操作。通过这种方式,您可以在您想要瞄准的所有平台上实现通用性。

我认为当涉及到你所瞄准的平台时,存在某种程度的等同性……如果你必须有单独的项目,你可以链接你的代码文件到其他项目,这样你就不必维护多个项目,甚至使用项目链接器(虽然我不知道是否存在2012版本)。

可移植REST最近在GitHub上可用,并且应该有助于在WebClient不可用的情况下发出web请求:

https://github.com/advancedrei/PortableRest自述

portableest是一个实现REST API的可移植类库在其他可移植类库中的客户端。它利用JSON。净的快速的、可定制的序列化,以及Microsoft.Bcl.Async可在任何平台上等待执行的库。它被设计成很大程度上与RestSharp兼容,尽管您需要这样做做一些修改并重新编译

这个初始版本对简单JSON请求的支持有限。更多的选项(包括XML,希望还有DataContract支持)将会出现在以后的版本中可用。

相当晚了,但这里有一个简单的代码我必须做,PLC是针对所有除了XBox 360(可能也工作)。我不能为这个目标列表使用HttpClient。

public class WebDownload
{
    public class WebDownloadResult
    {
        public HttpStatusCode StatusCode { get; set; }
        public int StatusCodeNumber { get; set; }
        public bool ErrorOccured { get; set; }
        public string ResultString { get; set; }
    }
    public static void Download(string url, Action<WebDownloadResult> resultAction)
    {
        WebDownloadResult response = new WebDownloadResult();
        try
        {
            HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(url);
            IAsyncResult result = (IAsyncResult)myHttpWebRequest.BeginGetResponse(new AsyncCallback(delegate(IAsyncResult tempResult)
            {
                HttpWebResponse webResponse = (HttpWebResponse)myHttpWebRequest.EndGetResponse(tempResult);
                Stream responseStream = webResponse.GetResponseStream();
                using (StreamReader reader = new StreamReader(responseStream, Encoding.UTF8))
                {
                    response.ResultString = reader.ReadToEnd();
                    response.StatusCode = webResponse.StatusCode;
                    response.StatusCodeNumber = (int)webResponse.StatusCode;
                    if (resultAction != null) resultAction(response);
                }
            }), null);
        }
        catch 
        {
            response.ErrorOccured = true;
            if (resultAction != null) resultAction(response);
        }
    }
}