[英]Trouble with MultiPart/Form-Data as a web request
我有一個HTML POST請求,需要在C#中復制
HTML就像
<FORM action="http://RemoteServerURL" enctype="multipart/form-data" method=POST>
<TEXTAREA id="TextAreaXML" name="xmlmsg" rows="20" cols="100"> </TEXTAREA>
<button type="submit">Send</button>
</form>
TextArea期望輸入如下
<?xml version="1.0" encoding="utf-8"?>
<OnlineCheck>
<Header>
<BuyerAccountId>XXXXXX</BuyerAccountId>
<AuthCode>XXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX</AuthCode>
<Type>STOCK</Type>
</Header>
<Item line="1">
<ManufacturerItemIdentifier />
<DistributorItemIdentifier>3109750</DistributorItemIdentifier>
<Quantity>7</Quantity>
</Item>
</OnlineCheck>
這部分工作正常。
現在,我試圖像下面這樣在C#中復制它。
WebRequest req = WebRequest.Create("http://RemoteServerURL");
string xmlmsg = "<?xml version=" + '"' + "1.0" + '"' + " encoding==" + '"' + "utf-8" + '"' + "?><OnlineCheck><Header><BuyerAccountId>XXXXXX</BuyerAccountId><AuthCode>XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXX</AuthCode><Type>STOCK</Type></Header><Item line=" + '"' + "1" + '"' + "><ManufacturerItemIdentifier /><DistributorItemIdentifier>3109750</DistributorItemIdentifier><Quantity>7</Quantity></Item></OnlineCheck>";
byte[] send = Encoding.Default.GetBytes(xmlmsg);
req.Method = "POST";
req.ContentType = "multipart/form-data";
req.ContentLength = send.Length;
Stream sout = req.GetRequestStream();
sout.Write(send, 0, send.Length);
sout.Flush();
sout.Close();
WebResponse res = req.GetResponse();
StreamReader sr = new StreamReader(res.GetResponseStream());
string returnvalue = sr.ReadToEnd();
這失敗,我收到消息
“該請求被拒絕,因為未找到XML請求的多部分邊界”
。 所以我知道對服務器的請求正在工作。 但是輸入或出了點問題。 請幫忙
擺脫sout.Flush();
, 這不是必需的。
看來錯誤消息很清楚,它要求多部分邊界。 內容類型:多份/混合; boundary =“ boundary”
我知道這是一個老話題,但是我想與社區分享我的解決方案,因為上周我遇到了類似的問題,因此提出了多方要求。 我不能使用RestSharp,因為它不支持除表單數據以外的內容類型,我需要“相關”。 我還需要基於帶有json元數據的pdf的base64字符串。 下面是我編寫的使用HttpClient和HttpRequestMessage完成此操作的示例函數。 我認為您可以采用這種結構,並輕松地將標頭換成您要執行的操作。
public static void PostBase64PdfHttpClient(string recordID, string docName, string pdfB64)
{
string url = $"baseURL";
HttpClient client = new HttpClient();
var myBoundary = "------------ThIs_Is_tHe_bouNdaRY_";
string auth = Convert.ToBase64String(Encoding.UTF8.GetBytes($"UN:PW"));
client.DefaultRequestHeaders.Add("Authorization", $"Basic {auth}");
HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, $"{url}/api-endpoint");
request.Headers.Date = DateTime.UtcNow;
request.Headers.Add("Accept", "application/json; charset=utf-8");
MultipartContent mpContent = new MultipartContent("related", myBoundary);
mpContent.Headers.TryAddWithoutValidation("Content-Type", $"multipart/related; boundary={myBoundary}");
dynamic jObj = new Newtonsoft.Json.Linq.JObject(); jObj.ID = recordID; jObj.Name = docName;
var jsonSerializeSettings = new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore };
var json = JsonConvert.SerializeObject(jObj, jsonSerializeSettings);
mpContent.Add(new StringContent(json, Encoding.UTF8, "application/json"));
mpContent.Add(new StringContent(pdfB64, Encoding.UTF8, "application/pdf"));
request.Content = mpContent;
HttpResponseMessage response = client.SendAsync(request).Result;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.