首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用包含文件的.Net framework HttpClient类发送表单数据post请求。

使用包含文件的.Net framework HttpClient类发送表单数据post请求。
EN

Stack Overflow用户
提问于 2019-11-21 19:39:13
回答 1查看 507关注 0票数 0

我需要用C#重新创建我用Postman提出的请求,我发现HttpClient类解决了我的大部分问题,但这次我无法自己解决它。我用一个关于post请求的例子来装饰一个图像。

邮递员的邮政请求

我需要发送三个文本参数和一个文件,其中包含一个内容类型的表单数据,该文件需要是一个.json。

我尝试以多种方式构建POST请求;这是我的最后一个版本:

代码语言:javascript
复制
            string endpoint = $"{Endpoint}/captcha";
            string token_paramsJSON = JsonConvert.SerializeObject(v3Request.token_params);
            Hashtable ParametrosPOSTCaptcha = GetV3POSTParams(v3Request);

            UnicodeEncoding uniEncoding = new UnicodeEncoding();
            using (Stream ms = new MemoryStream()) {
                var sw = new StreamWriter(ms, uniEncoding);
                sw.Write(token_paramsJSON);
                sw.Flush();
                ms.Seek(0, SeekOrigin.Begin);

                using (MultipartFormDataContent form = new MultipartFormDataContent())
                {
                    form.Add(new StringContent(v3Request.username), "username");
                    form.Add(new StringContent(v3Request.password), "password");
                    form.Add(new StringContent(v3Request.type.ToString()), "type");
                    form.Add(new StreamContent(ms));

                    var response = await _httpClient.PostAsync(endpoint, form);
                    string ResponseTest = await GetResponseText(response);
                }
            }

使用此代码,我成功地与端点建立了连接,发送用户名和密码。但这种反应与我对邮递员使用同样的截止符时的反应不同:

邮差: x=0&xx=1892036372&xxx=&xxxxx=1

我得到的实际反应是:

HttpClient:{"error": "not-logged-in"}

提前感谢!

EN

回答 1

Stack Overflow用户

发布于 2019-12-03 14:02:47

最后,我可以使用以下实现来解决这个问题:

代码语言:javascript
复制
string endpoint = $"{Endpoint}/endpointName";
        string token_paramsJSON = JsonConvert.SerializeObject(v3Request.token_params, Formatting.Indented);
        Dictionary<string,string> PostParams = GetPOSTParams(v3Request);

        HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, endpoint);

        UnicodeEncoding uniEncoding = new UnicodeEncoding();
        using (MultipartFormDataContent form = new MultipartFormDataContent())
        {
            foreach(var field in PostParams)
            {
                StringContent content = new StringContent(field.Value);
                content.Headers.ContentType = null;
                form.Add(content, field.Key);
            }
            var JsonFile = new StringContent(token_paramsJSON);
            JsonFile.Headers.ContentType = new MediaTypeHeaderValue("application/json");
            JsonFile.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data")
            {
                Name = "\"token_params\"",
                FileName = "\"token.json\""
            };
            form.Add(JsonFile);
            request.Content = form;
            var response = await _httpClient.SendAsync(request, CancellationToken.None);
            return await GetCaptchaFromResponse(response);
        }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58982586

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档