5

我正在开发一个需要发出 REST 请求的可移植类库,并且正在寻找像 Restsharp 或 EasyHttp 这样的东西。不幸的是,目前这些都不适用于 PCL。看到一个使用基本身份验证执行发布请求的示例也很好。

如果没有任何内容,是否有人举例说明我将如何使用基本身份验证进行发布请求?

4

4 回答 4

5

如果您针对 4.5 或 Windows 应用商店应用程序,您可以使用 HttpClient 作为 PCL。否则,您可以在https://github.com/Geodan/geoserver-csharp/tree/master/RestSharp尝试破解和斜线 RestSharp 的 PCL 端口

于 2012-11-26T09:27:47.873 回答
2

有一个最近刚刚宣布,目前在 GitHub 上可用。它被称为便携式休息

https://github.com/advancedrei/PortableRest

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

此初始版本对简单 JSON 请求的支持有限。更多选项(包括 XML 和希望 DataContract 支持)将在以后的版本中提供。

于 2013-02-11T10:46:48.463 回答
1

由于我只支持 windows phone 7.5 和更高版本,我能够使用这个库 ( Microsoft.Bcl.Async ) 将异步支持添加到我的 plc,然后使用这个解决方案

所以我的代码最终看起来像这样:

 public async Task<RequestResult> RunRequestAsync(string requestUrl, string requestMethod, object body = null)
    {
        HttpWebRequest req = WebRequest.Create(requestUrl) as HttpWebRequest;
        req.ContentType = "application/json";

        req.Credentials = new System.Net.NetworkCredential(User, Password);

        string auth = Convert.ToBase64String(Encoding.UTF8.GetBytes(string.Format("{0}:{1}", User, Password)));
        var authHeader = string.Format("Basic {0}", auth);
        req.Headers["Authorization"] = authHeader;

        req.Method = requestMethod; //GET POST PUT DELETE
        req.Accept = "application/json, application/xml, text/json, text/x-json, text/javascript, text/xml";

        if (body != null)
        {
            var json = JsonConvert.SerializeObject(body, new JsonSerializerSettings() { NullValueHandling = NullValueHandling.Ignore });
            byte[] formData = UTF8Encoding.UTF8.GetBytes(json);

            var requestStream = Task.Factory.FromAsync(
                req.BeginGetRequestStream,
                asyncResult => req.EndGetRequestStream(asyncResult),
                (object)null);

            var dataStream = await requestStream.ContinueWith(t => t.Result.WriteAsync(formData, 0, formData.Length));
            Task.WaitAll(dataStream);
        }

        Task<WebResponse> task = Task.Factory.FromAsync(
        req.BeginGetResponse,
        asyncResult => req.EndGetResponse(asyncResult),
        (object)null);

        return await task.ContinueWith(t =>
        {
            var httpWebResponse = t.Result as HttpWebResponse;

            return new RequestResult
            {
                Content = ReadStreamFromResponse(httpWebResponse),
                HttpStatusCode = httpWebResponse.StatusCode
            };

        });
    }

    private static string ReadStreamFromResponse(WebResponse response)
    {
        using (Stream responseStream = response.GetResponseStream())
        using (StreamReader sr = new StreamReader(responseStream))
        {
            //Need to return this response 
            string strContent = sr.ReadToEnd();
            return strContent;
        }
    }

然后我会用类似这样的方式调用代码:

public async Task<bool> SampleRequest()
        {            
            var res = RunRequestAsync("https//whatever.com/update/1", "PUT");
            return await res.ContinueWith(x => x.Result.HttpStatusCode == HttpStatusCode.OK);
        }

如果这对您来说还不够,请随时在此处查看项目的其余部分

于 2012-12-04T13:22:51.740 回答
0

您有一个便携式 RestSharp 在以下位置工作:

https://github.com/Geodan/geoserver-csharp/tree/master/RestSharp

看起来它运作良好......它使用 Json.net 来

于 2013-02-15T16:49:20.843 回答