c# - 使用 RestSharp 在 multipart/form-data POST 中包含文件时遇到问题
问题描述
我对与 C# 的 Web 交互比较陌生,并且在发出 POST 请求以使用 API 上传文件时遇到了一些麻烦。API 只接受文件作为正文中 multipart/form-data 部分的一部分。根据其他人的建议,我一直在尝试使用 RestSharp 来执行此操作,但我似乎无法将文件本身放入 POST。从 Postman 建议代码派生的代码块 - POST 工作的地方。
我已经尝试了几件事。此块导致 POST 通过正文中的正确参数,但未包含文件。
var client = new RestClient(postURL);
var request = new RestRequest(Method.POST);
request.AddHeader("cache-control", "no-cache");
request.AddHeader("Content-Type", "application/x-www-form-urlencoded");
request.AddHeader("content-type", "multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW");
request.AddParameter("multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW", string.Format("------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=\"upfile\"; filename=\"{0}\"\r\nContent-Type: application/xml\r\n\r\n\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=\"overwrite\"\r\n\r\ntrue\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW--", xmlPath), ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
string test = response.Content.ToString();
我还尝试了 AddFile 的一些变体——物理文件路径、字节数组和内容类型 = application/xml 的字节数组。通过这些迭代,我能够获得要发布的文件,但是 overwrite 参数没有正确通过来强制文件覆盖。
var client = new RestClient(postURL);
var request = new RestRequest(Method.POST);
request.AddHeader("cache-control", "no-cache");
request.AddHeader("Content-Type", "application/x-www-form-urlencoded");
request.AddHeader("content-type", "multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW");
// The different part below
request.AddFile("upfile", @xmlPath);
request.AddParameter("multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW", "------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=\"overwrite\"\r\n\r\ntrue\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW--", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
string test = response.Content.ToString();
*注意:我正在使用旧版本的 RestSharp (105.2.3) 与 .Net 4.0 兼容(在这种情况下坚持使用它)。
关于我在这里做错了什么的任何想法?
解决方案
睡了之后想通了,最后真的很简单。让我陷入循环的所有额外的 webkit 和多部分的东西都是完全没有必要的 - 来自 Postman 的自动生成的代码似乎过于复杂。
var client = new RestClient(postURL);
var request = new RestRequest(Method.POST);
request.AddHeader("cache-control", "no-cache");
request.AddHeader("Content-Type", "application/x-www-form-urlencoded");
request.AddHeader("content-type", "multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW");
request.AddFile("upfile", @xmlPath);
request.AddParameter("overwrite", "true", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
string test = response.Content.ToString();
推荐阅读
- attention-model - 从自定义注意力层中提取注意力权重
- java - 如何通过 Selenium WebDriver 关闭 Firefox 浏览器的“增强跟踪保护”?
- mysql - 如何使用 apt 包管理器安装特定的 MySQL
- ios - Algolia InstantSearch iOS 不会在每次击键时更新数据
- android - Android Lint 命令行工具不解析 Kotlin 文件
- ruby - 如何在 Ruby 中向 Azure 服务总线主题发送和接收消息
- java - 处理服务层结果的正确模式
- r - wru 包中的 Predict_race 函数即使使用帮助页面中的示例数据也会返回“未使用的参数”错误
- git - “EROR GITBash”bash:意外标记“换行符”附近的语法错误
- visual-studio-code - 为什么 Visual Studio Code 不自动关闭括号