如何向 Flurl 添加内容 header
How to add content header to Flurl
我想知道如何将内容 header 添加到 flurl-statement。
onedrive 实现要求我在内容中添加一个 content-type header,并尝试了所有可能的解决方案,但没有成功。
我不得不使用带有以下代码的常规 httpclient。
Public Async Function UploadFile(folder As String, filepath As String) As Task(Of Boolean) Implements ICloud.UploadFile
Dim data As Byte() = File.ReadAllBytes(filepath)
Dim uploadurl As String = "drive/items/" + folder + ":/" + Path.GetFileName(filepath) + ":/" + "content?access_token=" + Token.access_token
Using client As New HttpClient()
client.BaseAddress = New Uri(ApiUrl)
Dim request As HttpRequestMessage = New HttpRequestMessage(HttpMethod.Put, uploadurl)
request.Content = New ByteArrayContent(data)
request.Content.Headers.Add("Content-Type", "application/octet-stream")
request.Content.Headers.Add("Content-Length", data.Length)
Dim response = Await client.SendAsync(request)
Return response.IsSuccessStatusCode
End Using
End Function
我已经尝试了 Flurl 的常规 PutJsonAsync 方法,但没有成功。
这是我的代码中唯一剩下的 non-flurl 部分。
提前致谢
这里真正的问题是目前没有对在 Flurl 中发送流或字节数组的现成支持。我计划很快添加一些,但是有了您已经掌握的实现细节,您可以轻松地使用扩展方法自己添加它。 (原谅 C#,希望你能翻译成 VB。)
public static Task<HttpResponseMessage> PutFileAsync(this FlurlClient client, string filepath)
{
var data = File.ReadAllBytes(filepath);
var content = new ByteArrayContent(data);
content.Headers.Add("Content-Type", "application/octet-stream");
content.Headers.Add("Content-Length", data.Length);
return client.SendAsync(HttpMethod.Put, content: content);
}
如果你已经有一个 FlurlClient
,上面的方法是有效的,但是正如 docs 描述的那样,最好有相应的 string
和 Url
扩展,这可以只需委托给上述方法:
public static Task<HttpResponseMessage> PutFileAsync(this Url url, string filepath)
{
return new FlurlClient(url).PutFileAsync(filepath);
}
public static Task<HttpResponseMessage> PutFileAsync(this string url, string filepath)
{
return new FlurlClient(url).PutFileAsync(filepath);
}
将它们隐藏在静态助手中 class,它们应该可以与 Flurl 无缝协作:
await uploadurl.PutFileAsync(filepath)
我想知道如何将内容 header 添加到 flurl-statement。 onedrive 实现要求我在内容中添加一个 content-type header,并尝试了所有可能的解决方案,但没有成功。
我不得不使用带有以下代码的常规 httpclient。
Public Async Function UploadFile(folder As String, filepath As String) As Task(Of Boolean) Implements ICloud.UploadFile
Dim data As Byte() = File.ReadAllBytes(filepath)
Dim uploadurl As String = "drive/items/" + folder + ":/" + Path.GetFileName(filepath) + ":/" + "content?access_token=" + Token.access_token
Using client As New HttpClient()
client.BaseAddress = New Uri(ApiUrl)
Dim request As HttpRequestMessage = New HttpRequestMessage(HttpMethod.Put, uploadurl)
request.Content = New ByteArrayContent(data)
request.Content.Headers.Add("Content-Type", "application/octet-stream")
request.Content.Headers.Add("Content-Length", data.Length)
Dim response = Await client.SendAsync(request)
Return response.IsSuccessStatusCode
End Using
End Function
我已经尝试了 Flurl 的常规 PutJsonAsync 方法,但没有成功。 这是我的代码中唯一剩下的 non-flurl 部分。
提前致谢
这里真正的问题是目前没有对在 Flurl 中发送流或字节数组的现成支持。我计划很快添加一些,但是有了您已经掌握的实现细节,您可以轻松地使用扩展方法自己添加它。 (原谅 C#,希望你能翻译成 VB。)
public static Task<HttpResponseMessage> PutFileAsync(this FlurlClient client, string filepath)
{
var data = File.ReadAllBytes(filepath);
var content = new ByteArrayContent(data);
content.Headers.Add("Content-Type", "application/octet-stream");
content.Headers.Add("Content-Length", data.Length);
return client.SendAsync(HttpMethod.Put, content: content);
}
如果你已经有一个 FlurlClient
,上面的方法是有效的,但是正如 docs 描述的那样,最好有相应的 string
和 Url
扩展,这可以只需委托给上述方法:
public static Task<HttpResponseMessage> PutFileAsync(this Url url, string filepath)
{
return new FlurlClient(url).PutFileAsync(filepath);
}
public static Task<HttpResponseMessage> PutFileAsync(this string url, string filepath)
{
return new FlurlClient(url).PutFileAsync(filepath);
}
将它们隐藏在静态助手中 class,它们应该可以与 Flurl 无缝协作:
await uploadurl.PutFileAsync(filepath)