gns*_*ank 5 c# post multipartform-data flurl
我需要发布以下请求:
POST http://target-host.com/some/endpoint HTTP/1.1
Content-Type: multipart/form-data; boundary="2e3956ac-de47-4cad-90df-05199a7c1f53"
Accept-Encoding: gzip, deflate
Connection: Keep-Alive
Content-Length: 6971
Host: target-host.com
--2e3956ac-de47-4cad-90df-05199a7c1f53
Content-Disposition: form-data; name="some-label"
value
--2e3956ac-de47-4cad-90df-05199a7c1f53
Content-Disposition: form-data; name="file"; filename="my-filename.txt"
<file contents>
--2e3956ac-de47-4cad-90df-05199a7c1f53--
Run Code Online (Sandbox Code Playgroud)
我可以使用 Pythonrequests库轻松完成此操作,如下所示:
import requests
with open("some_file", "rb") as f:
byte_string = f.read()
requests.post(
"http://target-host.com/some/endpoint",
data={"some-label": "value"},
files={"file": ("my-filename.txt", byte_string)})
Run Code Online (Sandbox Code Playgroud)
有没有办法对Flurl.Http图书馆做同样的事情?
我的文档记录方式的问题是它将Content-Type为每个键值对插入filename*=utf-8''标头,并为文件数据插入标头。但是,我尝试向其发布请求的服务器不支持此功能。还要注意标题中name和filename值周围的双引号。
编辑:下面是我用来发出帖子请求的代码Flurl.Http:
using System.IO;
using Flurl;
using Flurl.Http;
namespace ConsoleApplication
{
public class Program
{
public static void Main(string[] args)
{
var fs = File.OpenRead("some_file");
var response = "http://target-host.com"
.AppendPathSegment("some/endpoint")
.PostMultipartAsync(mp => mp
.AddString("some-label", "value")
.AddFile("file", fs, "my-filename.txt")
).Result;
}
}
}
Run Code Online (Sandbox Code Playgroud)
根据规范(2011 年 6 月发布),建议同时发送filename和以获得最大兼容性:filename*
许多早于本规范的用户代理实现不理解“文件名*”参数。因此,当“文件名”和“文件名*”同时出现在单个标头字段值中时,收件人应该选择“文件名*”并忽略“文件名”。这样,发件人可以通过发送更具表现力的“文件名*”参数和作为旧收件人的后备的“文件名”参数来避免特殊情况下的特定用户代理。
如果filename*确实导致调用失败,则服务器遵守 HTTP 规范确实存在问题。此外,用引号引起name来filename是非常不标准的。
也就是说,Flurl 的快捷方式涵盖了 90% 的情况,但您始终可以使用底层 HttpClient API 来覆盖像这样的不寻常情况。在这种情况下,我认为您需要手动构建内容,以便可以处理这些Content-Disposition标题:
var mpc = new MultipartContent();
var sc = new StringContent("value");
sc.Headers.Add("Content-Disposition", "form-data; name=\"some-label\"");
mpc.Add(sc);
var fc = new StreamContent(fs);
fc.Headers.Add("Content-Disposition", "form-data; name=\"file\"; filename=\"my-filename.txt\"");
mpc.Add(fc);
Run Code Online (Sandbox Code Playgroud)
然后你可以将它与 Flul 一起使用,如下所示:
var response = await "http://target-host.com"....PostAsync(mpc);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3174 次 |
| 最近记录: |