5

Below is the code from Postman. I need to send this Body and Header in the POST Request

var client = new RestClient("https://azr-stg.dev03.abs.ase.southcentralus.us.wc.net/files/v11");
var request = new RestRequest(Method.POST);
request.AddHeader("cache-control", "no-cache");
request.AddHeader("Content-Type", "application/pdf");
request.AddHeader("X-Client-Id", "94437320-3bcf-498d-915a");
request.AddHeader("Tenant-Id", "0d3ad0cd-3bb3-4fc0-bd15");
request.AddHeader("content-type", "multipart/form-data; boundary=----WebKitFormBoundary7MA");
request.AddParameter("multipart/form-data; boundary=----WebKitFormBoundary7MA", "------WebKitFormBoundary7MA\r\nContent-Disposition: form-data; name=\"file\"; filename=\"sample.pdf\"\r\nContent-Type: application/pdf\r\n\r\n\r\n------WebKitFormBoundary7MA\r\nContent-Disposition: form-data; name=\"metadata\"\r\n\r\n\r\n------WebKitFormBoundary7MA--", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);

The above post is working good in Postman and able to upload the file, but i want to do this in programmatically. The API accepts content types ( like text, pdf, image files ).

how to format the body and header content to send the above with HttpClient request using multipart form-data

Here is where I am with example code for HttpClient. I am getting bad request / internal server error.

HttpClient _httpclient = new HttpClient()
using (var multiPartStream = new MultipartFormDataContent())
{



MemoryStream stream = new MemoryStream(filecontent);
//JsonSerializer.WriteObject(stream, newDocument);
ByteArrayContent firstPart = new ByteArrayContent(stream.ToArray());
firstPart.Headers.ContentType = JSON_GENERIC_MEDIA_TYPE;
firstPart.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data") { Name = "metadata" };
multiPartStream.Add(firstPart);
stream.Dispose();


StreamContent otherContent = new StreamContent(content);
otherContent.Headers.ContentType = new MediaTypeHeaderValue(applicationContentType);
//otherContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data") { Name = "file" };
otherContent.Headers.Add("Content-Disposition", $"form-data; name=\"file\"; filename=\"{docFullName}\"");

multiPartStream.Add(otherContent);


HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, urlTwo);
request.Content = multiPartStream;


 request.Headers.Accept.Add(“application/json”);
 request.Headers.Add("X-Client-Id", "94437320-3bcf-498d-915a");
 request.Headers.Add("Tenant-Id", "0d3ad0cd-3bb3-4fc0-bd15");
 HttpCompletionOption option = HttpCompletionOption.ResponseContentRead;

using (HttpResponseMessage response = _httpClient.SendAsync(request, option).Result)
{

if (response.IsSuccessStatusCode)
{
  var deserializedObject = JsonConvert.DeserializeObject<Walmart.MDM.MasterUIMVC.Helpers1.RootObject>(response.Content.ReadAsStringAsync().Result);
  return deserializedObject.properties.r_object_id.ToString();
}

Appreciate any help.

1 Answer 1

4

All, Finally i am able to reproduce the Postman code in C# programmatically.

I able to add the "metadata" property in the multipart form-data.

Reference: Upload Files Using HttpClient

string Seshat_URL = "https://azr-stg.dev03.abs.ase.southcentralus.us.wc.net/files/v11";
      using (var multiPartStream = new MultipartFormDataContent())
                {

                    multiPartStream.Add(new StringContent("{}"), "metadata");
                    multiPartStream.Add(new ByteArrayContent(filecontent, 0, filecontent.Length), "file", docName);
                    HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, Seshat_URL);
                    request.Content = multiPartStream;
                    //"application/json" - content type
                    request.Headers.Accept.Add(JSON_GENERIC_MEDIA_TYPE);  
                    request.Headers.Add("X-Client-Id", ClientId);                
                    request.Headers.Add("Tenant-Id", TenantId);

                    HttpCompletionOption option = HttpCompletionOption.ResponseContentRead;
                    System.Net.ServicePointManager.ServerCertificateValidationCallback = ((sender, certificate, chain, sslPolicyErrors) => true);

                    using (HttpResponseMessage response = _httpClient.SendAsync(request, option).Result)
                    {
                        if (response.IsSuccessStatusCode)
                        {
                            var deserializedObject = JsonConvert.DeserializeObject<Wc.MCM.UIMVC.Helpers1.BlobResponse>(response.Content.ReadAsStringAsync().Result);
                            return deserializedObject.fileId.ToString();
                        }                        
                    }

                }//End Try
Sign up to request clarification or add additional context in comments.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.