坚持使用POST MULTI PART FORM DATA - Xamarin.forms



我被困在xamarin.forms中的后多部分表单数据中。当我尝试使用POSTMAN时,它一切正常,但不适用于xamarin.forms中的代码。我不知道代码有什么问题。我正在使用一个将RestSharp端口称为PCL和.NET Core的库。

这是邮递员代码

    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", "------WebKitFormBoundary7MA4YWxkTrZu0gWrnContent-Disposition: form-data; name="phone"rnrn81234518rn------WebKitFormBoundary7MA4YWxkTrZu0gWrnContent-Disposition: form-data; name="address"rnrnAddress Dummy Housern------WebKitFormBoundary7MA4YWxkTrZu0gWrnContent-Disposition: form-data; name="password"rnrn123rn------WebKitFormBoundary7MA4YWxkTrZu0gWrnContent-Disposition: form-data; name="confpassword"rnrn123rn------WebKitFormBoundary7MA4YWxkTrZu0gWrnContent-Disposition: form-data; name="name"rnrnAlex Chengalan Pailyrn------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 +
                        "rnContent-Disposition: form-data; name="{0}"rnrn{1}rn";
                    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);

但是我在这里从服务器收到解析错误。请帮助我解决这种情况。

我对 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
}

嗯,取决于要传递到终结点的内容。这有效:

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;
                            }
                        }
                    }

最新更新