繁体   English   中英

如何使用HttpClient发出PostAsync请求以发送/上传CSV文件?

[英]How to make PostAsync request with HttpClient to send/upload CSV file?

我正在使用HttpClient进行PostAsync API调用以发送/上传CSV文件。我在PHP中具有等效的代码,效果很好。 但是,当我在C#中尝试使用它时,状态代码为500的错误消息为“内部服务器错误”。下面是我尝试过的C#代码。

  string apiUrl = "https://api.host/csv-upload/api-key?remove-hosts=false";

            HttpClient client = new HttpClient();

            //Prepare request header
            client.DefaultRequestHeaders.Accept.Clear();
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/x-www-form-urlencoded"));
            client.DefaultRequestHeaders.Add("Api-Key", "xxxyyyzzz");


            //cache
            CacheControlHeaderValue cacheControl = new CacheControlHeaderValue();
            cacheControl.NoCache = true;
            client.DefaultRequestHeaders.CacheControl = cacheControl;

            byte[] bytes = File.ReadAllBytes(csvFilePath); //c://Temp/test.csv
            HttpContent fileContent = new ByteArrayContent(bytes);
            fileContent.Headers.ContentType = MediaTypeHeaderValue.Parse("text/csv");

            MultipartFormDataContent content = new MultipartFormDataContent();
            content.Add(fileContent, "file", "test.csv");

            try
            {
                string message = client.PostAsync(new Uri(apiUrl), content).ContinueWith(async responseTask =>
                {
                    HttpResponseMessage response = await responseTask;

                    return response.Content.ReadAsStringAsync().ContinueWith(async contentTask =>
                    {
                        string contents = await contentTask;
                        return contents;
                    }).Result.Result;
                }).Result.Result;


            }
            catch(Exception ex)
            {
                string message = ex.Message;
                Console.WriteLine(message); ;
            }
            finally
            {
                Console.WriteLine("Error");
            }

调用api时,我希望状态代码为202。

但是实际结果是"Internal server error"

可以正常工作的等效PHP代码是:

function api_call($url, $api_key, $csv_file) {

   $request = new \Http_Request2($url);

   $request->setHeader(array(
        'Api-Key' => $api_key,
       'content-type'  => 'application/x-www-form-urlencoded'
   ));

   $request->setMethod(\HTTP_Request2::METHOD_POST);
   $request->addUpload('file' , $csv_file , 'file' , 'text/csv');
   $response = $request->send();

   return $response->getBody();
}

试试下面的代码

string apiUrl = "https://api.host/csv-upload/api-key?remove-hosts=false;

            HttpClient client = new HttpClient();

            //Prepare request header
            client.DefaultRequestHeaders.Accept.Clear();
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/x-www-form-urlencoded"));
            client.DefaultRequestHeaders.Add("Api-Key", "xxxyyyzzz");


            //cache
            CacheControlHeaderValue cacheControl = new CacheControlHeaderValue();
            cacheControl.NoCache = true;
            client.DefaultRequestHeaders.CacheControl = cacheControl;

            byte[] bytes = File.ReadAllBytes(csvFilePath); //c://Temp/test.csv
            HttpContent fileContent = new ByteArrayContent(bytes);
            fileContent.Headers.ContentType = MediaTypeHeaderValue.Parse("text/csv");


            try
            {

                var response = await httpClient.PostAsync(apiUrl , new MultipartFormDataContent
                        {
                            {fileContent, "\"file\"", "\"test.csv\""}
                        });
            }
            catch(Exception ex)
            {
                string message = ex.Message;
                Console.WriteLine(message); ;
            }
            finally
            {
                Console.WriteLine("Error");
            }`

或替换content.Add(fileContent,“ file”,“ test.csv”);

content.Add(fileContent,“ \\”文件\\“”,“ \\” test.csv \\“);

这适用于.net 4.5。

注意MultipartFormDataContent中的\\“。MultipartFormDataContent中有一个错误。

在4.5.1中,MultipartFormDataContent使用正确的引号包装数据。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM