BestHttp文档翻译 1

2019-08-28  本文已影响0人  诸子百家谁的天下

BestHttp 文档翻译

介绍

BestHTTP 是基于 RFC 2616 的 HTTP/1.1 实现 , 它支持几乎所有Unity移动和独立平台 (请参阅 Supported platforms).

我的目标是为Unity创建一个易于使用但功能强大的插件,以利用HTTP / 1.1中的潜力. 本文档是一个快速指南,并非所有功能和属性都可以在这里找到. 如需支持,功能请求或一般性问题,您可以发送电子邮件至besthttp@gmail.com.

快速入门

using BestHTTP; 
{
        HTTPRequest request = new HTTPRequest(new Uri("https://google.com"), OnRequestFinished); request.Send(); 

        new HTTPRequest(new Uri("https://google.com"), (request, response) => Debug.Log("Finished!")).Send(); 
}
void OnRequestFinished(HTTPRequest request, HTTPResponse response) 
{    
        Debug.Log("Request Finished! Text received: " + response.DataAsText); 
} 

回调函数始终接收原始HTTPRequest对象和保存服务器响应的HTTPResponse对象。如果出现错误,则HTTPResponse对象为null,需要自己判断,并且请求对象具有Exception属性,该属性可能包含有关错误的额外信息(如果有).
虽然请求总是在不同的线程上处理,但调用回调函数已完成Unity的主线程,所以我们不必做任何线程同步。

        HTTPRequest request = new HTTPRequest(new Uri("http://server.com/path"), HTTPMethods.Post, OnRequestFinished); 
        request.AddField("FieldName", "Field Value"); 
        request.Send(); 

要在不设置字段的情况下POST任何数据,可以使用RawData属性

HTTPRequest request = new HTTPRequest(new Uri("http://server.com/path"), HTTPMethods.Post, OnRequestFinished); 
request.RawData =  Encoding.UTF8.GetBytes("Field Value"); 
request.Send(); 

有关其他样品,请查看Small Code-Samples部分。

除了GET和POST之外,您还可以使用 HEAD,PUT,DELETE,PATCH 方法:

HTTPRequest request = new HTTPRequest(new Uri("http://server.com/path"), HTTPMethods.Head, OnRequestFinished); 
request.Send(); 

HTTPRequest request = new HTTPRequest(new Uri("http://server.com/path"), HTTPMethods.Put, OnRequestFinished); 
request.Send(); 

HTTPRequest request = new HTTPRequest(new Uri("http://server.com/path"), HTTPMethods.Delete, OnRequestFinished); 
request.Send(); 

HTTPRequest request = new HTTPRequest(new Uri("http://server.com/path"), HTTPMethods.Patch, OnRequestFinished); 
request.Send(); 
new HTTPRequest(new Uri("http://yourserver.com/path/to/image.png"), (request, response) => 
        { 
                var tex = new Texture2D(0, 0); 
                tex.LoadImage(response.Data); 
                guiTexture.texture = tex; 
        }).Send(); 

new HTTPRequest(new Uri("http://yourserver.com/path/to/image.png"),
(request, response) => guiTexture.texture = response.DataAsTexture2D).Send(); 

除 response.DataAsTexture2D 外,还有一个 response.DataAsText 属性可将响应解码为Utf8字符串。将来可能会添加更多数据解码属性。如果您有任何想法,请自己添加吧.

HTTPRequest request = new HTTPRequest(new Uri("http://server.com"));
request.Send(); 
yield return StartCoroutine(request); 
Debug.Log("Request finished! Downloaded Data:" + request.Response.DataAsText); 

高级用法

public static void RequestAsyncShort(string url, RequestCallBack callBack)
    {
        BestHTTP.HTTPRequest req = new HTTPRequest(new Uri(url), HTTPMethods.Get, 
            (originalRequest, response) =>
            {
                if (originalRequest.State == HTTPRequestStates.Finished)
                {
                    callBack((int) originalRequest.State, response.DataAsText);
                }
                else
                {
                    callBack((int) originalRequest.State, "");
                }
            });
        req.IsKeepAlive = false;
        req.DisableCache = true;
        req.Send();
    }
using BestHTTP.Authentication; 
var request = new HTTPRequest(new Uri("http://yourserver.org/auth-path"), (req, resp) => 
        { 
                if (resp.StatusCode != 401) 
                        Debug.Log("Authenticated"); 
                else 
                        Debug.Log("NOT Authenticated"); 
                Debug.Log(resp.DataAsText); 
        }); 
request.Credentials = new Credentials("usr", "paswd"); 
request.Send(); 
var request = new HTTPRequest(new Uri("http://yourserver.com/bigfile"), (req, resp) => 
{ 
        List<byte[]> fragments = resp.GetStreamedFragments(); 
        // Write out the downloaded data to a file: 
        using (FileStream fs = new FileStream("pathToSave", FileMode.Append)) {
                foreach(byte[] data in fragments) fs.Write(data, 0, data.Length); 
        }
        if (resp.IsStreamingFinished) Debug.Log("Download finished!"); 
}); 
request.UseStreaming = true; 
request.StreamFragmentSize = 1 * 1024 * 1024; // 1 megabyte
request.DisableCache = true; // already saving to a file, so turn off caching request.Send();  
    1):我们将标志 - UseStreaming - 切换为true,因此我们的回调可能被调用多次。
    2):StreamFragmentSize指示在调用回调之前我们想要在内存中缓冲的最大数据量。
    3):每次下载StreamFragmentSize大小的块时都会调用我们的回调,并且当IsStreamingFinished设置为true时再调用一次。
    4):要获取下载的数据,我们必须使用GetStreamedFragments()函数。我们应该将结果保存在临时变量中,因为在此调用中清除了内部缓冲区(返回字节量,清除内存,写入文件),因此连续调用将为我们提供null结果。
    5):我们在此示例中禁用了缓存,因为我们已经保存了下载的缓存,保存在一个磁盘文件中,并且我们不想占用太多空间。

下载进度

var request = new HTTPRequest(new Uri(address), OnFinished); 
request.OnProgress = OnDownloadProgress; 
request.Send(); 
void OnDownloadProgress(HTTPRequest request, int downloaded, int length) 
{ 
        float progressPercent = (downloaded / (float)length) * 100.0f;
        Debug.Log("Downloaded: " + progressPercent.ToString("F2") + "%"); 
} 
var request = new HTTPRequest(new Uri(address), HTTPMethods.Post, OnUploadFinished); 
request.UploadStream = new FileStream("File_To.Upload", FileMode.Open); 
request.Send(); 

上传进度回调,要跟踪和显示上传进度,您可以使用HTTPRequest类的OnUploadProgress事件。 OnUploadProgress可以与RawData,表单(通过AddField和AddBinaryData)以及UploadStream一起使用。

var request = new HTTPRequest(new Uri(address), HTTPMethods.Post, OnFinished); 
request.RawData =  Encoding.UTF8.GetBytes("Field Value");
request.OnUploadProgress = OnUploadProgress; 
request.Send(); 
void OnUploadProgress(HTTPRequest request, long uploaded, long length)
{ 
        float progressPercent = (uploaded / (float)length) * 100.0f;
        Debug.Log("Uploaded: " + progressPercent.ToString("F2") + "%"); 
}

缓存也基于HTTP / 1.1 RFC。它使用标头来存储和验证响应。缓存机制在幕后工作,我们唯一要做的就是决定是否要启用或禁用它。如果缓存的响应具有带有未来日期的“Expires”标头,则BestHTTP将使用缓存的响应,而不对服务器进行验证。这意味着我们不必启动与服务器的任何tcp连接。这可以节省我们的时间,带宽和离线工作。 (这段话的意思相当于本地数据缓存,请求服务器,不会真的连接服务器,会从本地取出原来已经请求过的数据,只要这个数据没有过期,则直接返回给使用者)

虽然缓存是自动的,但我们可以控制它,或者我们可以使用HTTPCacheService类的公共函数获取一些信息:

    1):BeginClear(),它将开始在单独的线程上清除整个缓存
    2):BeginMaintainence(),有了这个函数的帮助,我们可以根据上次访问时间删除缓存的条目。它删除上次访问时间早于指定时间的条目。我们还可以使用此函数来控制缓存大小:
            HTTPCacheService.BeginMaintainence(new HTTPCacheMaintananceParams(TimeSpan.FromDays(14), 50 * 1024 * 1024)); 
    3):GetCacheSize(),将以字节为单位返回缓存的大小。
    4):GetCacheEntryCount(),将返回缓存中存储的条目数。可以使用float avgSize = GetCacheSize()/(float)GetCacheEntryCount()公式计算平均缓存条目大小。
    1):使用每一次的请求对象HTTPRequest.IsCookiesEnabled属性以及全局的HTTPManager.IsCookiesEnabled属性来禁用
    2):可以通过调用CookieJar.Clear()函数从Cookie Jar中删除Cookie
    3):可以通过响应的Cookies属性访问从服务器发送的新cookie。

可以通过将Cookie添加到Cookie列表中将Cookie添加到HTTPRequest:

var request = new HTTPRequest(new Uri(address), OnFinished);
request.Cookies.Add(new Cookie("Name", "Value")); 
request.Send(); 

这些cookie将与服务器发送的cookie合并。如果在请求或HTTPManager中将IsCookiesEnabled设置为false,则仅发送这些用户设置的cookie

request.Proxy = new HTTPProxy(new Uri("http://localhost:3128")); 

您也可以设置全局代理,因此您不必手动将其设置为所有请求。请参阅Global Settings一章

request = new HTTPRequest(new Uri("http://yourserver.com/bigfile"), (req, resp) => { ... }); 
request.Send(); 
// And after some time: 
request.Abort(); //将调用回调函数,并且响应对象(resp)将为null。
request = new HTTPRequest(new Uri("http://yourserver.com/"), (req, resp) => { ... }); 
request.ConnectTimeout = TimeSpan.FromSeconds(2); 
request.Send(); 

第二种:Timeout 使用此属性,您可以控制等待处理请求的时间(此时已连接到服务器,正在等待服务器响应,发送请求和下载响应)。其默认值为60秒。

request = new HTTPRequest(new Uri("http://yourserver.com/"), (req, resp) => { ... }); 
request.Timeout = TimeSpan.FromSeconds(10); 
request.Send(); 



string url = "http://besthttp.azurewebsites.net/api/LeaderboardTest?from=0&count=10"; 
HTTPRequest request = new HTTPRequest(new Uri(url), (req, resp) => 
 { 
         switch (req.State) 
         { 
                 // The request finished without any problem. 
                 case HTTPRequestStates.Finished: 
                        Debug.Log("Request Finished Successfully!\n" + resp.DataAsText); 
                        break; 
                        // The request finished with an unexpected error. 
                // The request's Exception property may contain more information about the error. 
                case HTTPRequestStates.Error: 
                        Debug.LogError("Request Finished with Error! " + (req.Exception != null ? (req.Exception.Message + "\n" + req.Exception.StackTrace) : "No Exception")); 
                break; 
                // The request aborted, initiated by the user. 
                case HTTPRequestStates.Aborted: 
                        Debug.LogWarning("Request Aborted!"); 
                break; 
                // Ceonnecting to the server timed out. 
                case HTTPRequestStates.ConnectionTimedOut: 
                        Debug.LogError("Connection Timed Out!"); 
                break; 
                // The request didn't finished in the given time. 
                case HTTPRequestStates.TimedOut: 
                        Debug.LogError("Processing the request Timed Out!"); break; 
        } 
}); 
// Very little time, for testing purposes: 
request.ConnectTimeout = TimeSpan.FromMilliseconds(2); 
request.Timeout = TimeSpan.FromSeconds(5); 
request.IsKeepAlive = false; 
request.DisableCache = true; 
request.Send(); 
    1):Initial:请求的初始状态。使用此状态不会调用任何回调
    2):Queued:在队列中等待处理。使用此状态不会调用任何回调
    3):Processing:开始处理请求。在此状态下,客户端将发送请求,并解析响应。使用此状态不会调用任何回调。
    4):Finished:请求完成没有问题。解析完成的响应后,可以使用结果。将使用有效的响应对象调用用户定义的回调。请求的Exception属性将为null。
    5):Error:请求在插件中以意外错误结束。将使用null响应对象调用用户定义的回调。请求的Exception属性可能包含有关错误的更多信息,但它可以为null。
    6):Aborted: 请求由客户端中止(HTTPRequest的Abort()函数)。将使用null响应调用用户定义的回调。请求的Exception属性将为null。
    7):ConnectionTimedOut:连接到服务器超时。将使用null响应调用用户定义的回调。请求的Exception属性将为null。
    8):TimedOut:请求未在给定时间内完成。将使用null响应调用用户定义的回调。请求的Exception属性将为null。
var request = new HTTPRequest(new Uri("https://google.com"), ...);
request.Priority = -1; 
request.Send(); 
using System; 
using Org.BouncyCastle.Crypto.Tls; 
using Org.BouncyCastle.Asn1.X509; 
class CustomVerifier : ICertificateVerifyer 
{ 
        public bool IsValid(Uri serverUri, X509CertificateStructure[] certs) 
        { 
        // TODO: Return false, if validation fails return true; 
        } 
} 
var request = new HTTPRequest(new Uri("https://google.com"), ...);
request.CustomCertificateVerifyer = new CustomVerifier(); 
request.UseAlternateSSL = true; 
request.Send(); 
var request = new HTTPRequest(uri, HTTPMethods.Post); 
request.AddField("field", "data"); 
request.OnBeforeRedirection += OnBeforeRedirect; 
request.Send(); 
bool OnBeforeRedirect(HTTPRequest req, HTTPResponse resp, Uri redirectUri) 
{ 
        if (req.MethodType == HTTPMethods.Post && resp.StatusCode == 302) 
        { 
                req.MethodType = HTTPMethods.Get; 
                // Don't send more data than needed. 
                // So we will delete our already processed form data.
                req.Clear(); 
        } 
        return true; 
} 
GeneralStatistics stats = HTTPManager.GetGeneralStatistics(StatisticsQueryFlags.All); Debug.Log(stats.ActiveConnections); 
    1):Connections:将返回基于连接的统计信息。这些是以下内容:
            A:RequestsInQueue:队列中等待空闲连接的请求数。
            B:Connections:插件跟踪的HTTPConnection实例数。这是以下所有连接的总和
            B:ActiveConnections:活动连接数。这些连接当前正在处理请求。
            C:FreeConnections:免费连接数。这些连接完成了请求,他们正在等待另一个请求或回收。
            D:RecycledConnections:回收连接数。这些连接将尽快删除。
    2):Cache:基于缓存的统计信息这些是以下内容:
            A:CacheEntityCount:缓存响应的数量。
            B:CacheSize:缓存响应的总和大小
    3):Cookie:基于Cookie的统计信息。这些是以下内容
            A:CookieCount:Cookie Jar中的Cookie数量
            B:CookieJarSize:Cookie Jar中Cookie的总和大小

Global Settings

    1):MaxConnectionPerServer:允许唯一主机的连接数。 http://example.org和https://example.org被视为两个独立的服务器。默认值为4。
    2):KeepAliveDefaultValue:HTTPRequest的IsKeepAlive属性的默认值。如果IsKeepAlive为false,则将在每个请求之前设置与服务器的tcp连接,并在其之后立即关闭。如果连续请求很少,则应将其更改为false。赋予HTTPRequest构造函数的值将仅覆盖此请求的此值。默认值是true。
    3):IsCachingDisabled:使用此属性,我们可以全局禁用或启用缓存服务。赋予HTTPRequest构造函数的值将仅覆盖此请求的此值。默认值是true。
    4):MaxConnectionIdleTime:指定BestHTTP在完成最后一次请求后销毁连接之前应等待的空闲时间。默认值为2分钟。
    5):IsCookiesEnabled:使用此选项,可以启用或禁用所有Cookie操作。默认值是true。
    6):CookieJarSize:使用此选项可以控制Cookie存储的大小。默认值为10485760(10 MB).
    7):EnablePrivateBrowsing:如果启用此选项,则不会将Cookie写入磁盘。默认值为false
    8):ConnectTimeout:使用此选项,您可以设置HTTPRequests的默认ConnectTimeout值。默认值为20秒。
    9):RequestTimeout:使用此选项,您可以设置HTTPRequests.Timeout的默认超时值。默认值为60秒。
    10):RootCacheFolderProvider:默认情况下,插件会将所有缓存和cookie数据保存在Application.persistentDataPath返回的路径下。您可以为此委托指定一个函数,以返回自定义根路径以定义新路径。这个代理将在子线程上调用!
    11):Proxy:所有HTTPRequests的全局默认代理。 HTTPRequest的代理仍然可以按请求进行更改。默认值为null
    12):Logger:ILogger实现,能够控制将记录有关插件内部的信息,以及如何记录这些信息
    13):DefaultCertificateVerifyer:可以将ICertificateVerifyer实现设置为此属性。之后创建的所有新请求将在使用安全协议且请求的UseAlternateSSL为true时使用此验证程序。 ICertificateVerifyer实现可用于实现服务器证书验证。
    14):UseAlternateSSLDefaultValue:可以通过此属性更改HTTPRequest的UseAlternateSSL的默认值。
    15):HTTPManager.MaxConnectionPerServer = 10; HTTPManager.RequestTimeout = TimeSpan.FromSeconds(120); 

关于线程

上一篇下一篇

猜你喜欢

热点阅读