我在xamarin.forms中发布了多部分表单数据。当我尝试使用POSTMAN时,它的工作正常但不是我在xamarin.forms中的代码。我不知道代码有什么问题。我正在使用一个名为RestSharp port as PCL and for .NET Core的库。
这是POSTMAN代码
var client = new RestClient("http://192.168.2.126:86/Appointment.svc/UploadFileios");
var request = new RestRequest(Method.POST);
request.AddHeader("postman-token", "11a61861-ed9c-2f35-751b-6b615907c269");
request.AddHeader("cache-control", "no-cache");
request.AddHeader("content-type", "multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW");
request.AddParameter("multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW", "------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=\"phone\"\r\n\r\n81234518\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=\"address\"\r\n\r\nAddress Dummy House\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=\"password\"\r\n\r\n123\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=\"confpassword\"\r\n\r\n123\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=\"name\"\r\n\r\nAlex Chengalan Paily\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW--", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
以下是我的代码xamarin.forms。
var client = new RestClient(url);
var request = new RestRequest(Method.POST);
string boundary = "---------------------------" + DateTime.Now.Ticks.ToString("x");
//string boundary = "----WebKitFormBoundary7MA4YWxkTrZu0gW";
request.AddHeader("cache-control", "no-cache");
request.AddHeader("content-type", "multipart/form-data; boundary=" + boundary);
string name = "multipart/form-data; boundary=" + boundary;
string formdataTemplate = "--" + boundary +
"\r\nContent-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}\r\n";
string formitem = null;
foreach (string key in nvc.Keys)
{
formitem = formitem + string.Format(formdataTemplate, key, nvc[key]);
}
Debug.WriteLine("Items: " + formitem);
request.AddParameter(name, formitem, ParameterType.RequestBody);
IRestResponse response = await client.Execute(request);
但是我从服务器那里得到一个解析错误。请帮我解决这个问题。
答案 0 :(得分:0)
我对RestSharp库不够熟悉,但这里有一个支持文件流和其他变量的工作示例,没有任何第三方依赖,并且从PCL中使用Xamarin.Forms(注意你不需要弄乱)手动边界):
try
{
var file = await PCLStorage.FileSystem.Current.LocalStorage.GetFileAsync(device.ClientCodePhoto);
using(Stream fileStream = await file.OpenAsync(PCLStorage.FileAccess.Read))
using(var client = new HttpClient())
using(var content = new MultipartFormDataContent())
{
content.Add(new StreamContent(fileStream), "client_code_image", "upload.jpg");
var values = new[]
{
new KeyValuePair<string, string>("client_code", device.ClientCode),
new KeyValuePair<string, string>("registered_by", device.RegisteredBy),
new KeyValuePair<string, string>("notes", device.Notes ?? string.Empty),
new KeyValuePair<string, string>("sim_code", device.SimCode),
new KeyValuePair<string, string>("qr_codes", device.QrCodes)
};
foreach(var keyValuePair in values)
content.Add(new StringContent(keyValuePair.Value), string.Format("\"{0}\"", keyValuePair.Key));
using(var result = await client.PostAsync($"{Constants.Server}devices/", content))
{
var input = await result.Content.ReadAsStringAsync();
if(result.IsSuccessStatusCode)
{
// do something with the result
}
}
}
}
catch(Exception ex)
{
Debug.WriteLine(ex.Message);
// something went wrong
}
答案 1 :(得分:0)
好,取决于您要传递到端点的内容。 这有效:
Uri baseAddress = new Uri("https://" + "www.url.com");
CookieContainer cookieContainer = new CookieContainer();
using (HttpClientHandler handler = new HttpClientHandler() { CookieContainer = cookieContainer })
using (HttpClient client = new HttpClient(handler) { BaseAddress = baseAddress })
using (MultipartFormDataContent content = new MultipartFormDataContent())
{
KeyValuePair<string, string>[] values = new[]
{
new KeyValuePair<string, string>("attachment", ""),
};
foreach (KeyValuePair<string, string> keyValuePair in values)
{
content.Add(new StringContent(keyValuePair.Value), string.Format("\"{0}\"", keyValuePair.Key));
}
//for cookies
cookieContainer.Add(baseAddress, new Cookie("name", "value"));
client.DefaultRequestHeaders.Add("cache-control", "no-cache");
client.DefaultRequestHeaders.Add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3");
client.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Linux; Android 8.0.0; SM-G960F Build/R16NW) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.84 Mobile Safari/537.36");
//client.DefaultRequestHeaders.Add("Content-Type", "multipart/form-data");
client.DefaultRequestHeaders.Add("DNT", "1");
client.DefaultRequestHeaders.Add("Upgrade-Insecure-Requests", "1");
client.DefaultRequestHeaders.Add("Origin", "https://www.url.com");
string finalUrl = "/url";
using (HttpResponseMessage result = await client.PostAsync(finalUrl, content))
{
string input = await result.Content.ReadAsStringAsync();
if (result.IsSuccessStatusCode)
{
return true;
}
}
}