如何从可移植类库调用REST服务
本文关键字:调用 REST 服务 类库 可移植 | 更新日期: 2023-09-27 17:50:51
我的目标项目是Windows 8, WinRT和Windows Phone 8。我使用可移植类库作为解决方案,以便共享源代码。我需要调用在另一个MVC Web Api项目中创建的一些REST服务,但HttpClient
类在PCL中不可用。哪个是解决它的好方法?我在考虑一个服务接口,然后为每个平台创建一个项目,在每种情况下使用HttpClient
, WebClient
或适当的类。这种方法可以工作,但我想知道是否有其他方法。
微软已经将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);
}
}
}