使用multipart/form-data方式提交数据与普通的post方式有一定区别。multipart/form-data的请求头必须包含一个特殊的头信息:Content-Type,其值必须为multipart/form-data。另外还需要规定一个内容分割符用于分割请求体中的多个post的内容,如文件内容和文本内容,只有这样服务端才能正常解析数据。但是,multipart/form-data的基础还是post,它是由post方法来实现的。

点击【Code】按钮,打开如下窗体:

可以看到 Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW

以及蓝色框内的用分隔符分割的请求体中的内容。

在某些应用场景下,表单数据以键值对集合存储,然后将键值对集合上传到远程服务器。

通用方法如下:

 /// <summary>
/// HTTP请求(包含表单数据)
/// </summary>
/// <param name="url">请求目标URL</param>
/// <param name="kvDatas">请求时表单键值对数据</param>
/// <param name="method">请求的方法。请使用 WebRequestMethods.Http 的枚举值</param>
/// <returns></returns>
public HttpResult UploadForm(string url, NameValueCollection kvDatas, string method = WebRequestMethods.Http.Post)
{
HttpResult httpResult = new HttpResult();
HttpWebRequest httpWebRequest = null; try
{
httpWebRequest = WebRequest.Create(url) as HttpWebRequest;
httpWebRequest.Method = method;
httpWebRequest.Headers = HeaderCollection;
httpWebRequest.CookieContainer = CookieContainer;
httpWebRequest.ContentType = HttpContentType.WWW_FORM_URLENCODED;
httpWebRequest.UserAgent = _userAgent;
httpWebRequest.AllowAutoRedirect = _allowAutoRedirect;
httpWebRequest.ServicePoint.Expect100Continue = false; if (kvDatas != null)
{
StringBuilder sbKV = new StringBuilder();
foreach (string key in kvDatas.Keys)
{
sbKV.AppendFormat("{0}={1}&", Uri.EscapeDataString(key), Uri.EscapeDataString(kvDatas[key])); //注意中文编码
} httpWebRequest.AllowWriteStreamBuffering = true;
using (Stream requestStream = httpWebRequest.GetRequestStream())
{
requestStream.Write(EncodingType.GetBytes(sbKV.ToString()), , sbKV.Length - );
requestStream.Flush();
}
} HttpWebResponse httpWebResponse = httpWebRequest.GetResponse() as HttpWebResponse;
if (httpWebResponse != null)
{
GetResponse(ref httpResult, httpWebResponse);
httpWebResponse.Close();
}
}
catch (WebException webException)
{
GetWebExceptionResponse(ref httpResult, webException);
}
catch (Exception ex)
{
GetExceptionResponse(ref httpResult, ex, method, HttpContentType.WWW_FORM_URLENCODED);
}
finally
{
if (httpWebRequest != null)
{
httpWebRequest.Abort();
}
} return httpResult;
}

1、向 NameValueCollection 类中添加项时,键可以重复。

2、如果添加了C#中的某些关键字作为集合的键则会报错,解决方法是,给关键字添加前缀或者后缀,在解析时再去除前缀或者后缀。

借助于上述方法,又衍生出一个重载方法:

 /// <summary>
/// HTTP请求(包含表单数据)
/// </summary>
/// <param name="url">请求目标URL</param>
/// <param name="kvDatas">请求时表单键值对数据</param>
/// <param name="method">请求的方法。请使用 WebRequestMethods.Http 的枚举值</param>
/// <returns></returns>
public HttpResult UploadForm(string url, Dictionary<string, string> kvDatas, string method = WebRequestMethods.Http.Post)
{
var nvc = kvDatas.ToNameValueCollection(); return UploadForm(url, nvc, method);
}

Dictionary 字典中不能添加重复的键。

Dictionary 转换成 NameValueCollection 集合的扩展方法如下:
 /// <summary>
/// 自定义扩展方法:将字典转换为 NameValueCollection 集合对象
/// </summary>
/// <param name="dict">扩展对象</param>
/// <returns></returns>
public static NameValueCollection ToNameValueCollection<TKey, TValue>(this IDictionary<TKey, TValue> dict)
{
if (dict == null)
{
return null;
} var nameValueCollection = new NameValueCollection(); foreach (var item in dict)
{
string value = null;
if (item.Value != null)
{
value = item.Value.ToString();
} nameValueCollection.Add(item.Key.ToString(), value);
} return nameValueCollection;
}

源码下载链接: https://pan.baidu.com/s/1bYh2COYxxeG1WIYJt6Wsnw 提取码: ysqd

最新文章

  1. SSH:Struts2.2+Hibernate3.6+Spring3.1分页示例[转]
  2. hdu 1052 (greedy algorithm) 分类: hdoj 2015-06-18 16:49 35人阅读 评论(0) 收藏
  3. Python开发入门与实战7-Django Form
  4. PHP 设计模式 笔记与总结(3)SPL 标准库
  5. 使用sql访问EXECL文件
  6. A@2a139a55 结果产生的原因
  7. MVC初学1
  8. Quality Over Quantity: 更少一些,更好一些_第1页_福布斯中文网
  9. LNMPA by lin
  10. Hbase学习03
  11. Knowledge-Defined Networking
  12. Samsung_tiny4412(驱动笔记06)----list_head,proc file system,GPIO,ioremap
  13. xslt 简单的语法
  14. hdu2710 Max Factor
  15. lost+found目录有啥用?
  16. Grunt-jsdoc生成JS API文档
  17. 几个经典的数学库之一学习---VCGlib(3)
  18. Android通过Intent传递对象
  19. MySQL入门篇(二)之常见命令管理
  20. (转)Android学习笔记②——HelloWorld的创建已经基本知识

热门文章

  1. WPF 通过EventTrigger修改鼠标样式
  2. 【LOJ#3144】[APIO2019]奇怪装置(数论)
  3. ocelot性能测试
  4. 使用NumPy、Numba的简单使用(二)
  5. Grafana的Docker部署方式
  6. 大文件SQl脚本怎么还原以及SQlsqlserver怎么全自动备份数据库
  7. RabbitMQ、RPC、SaltStack &quot;贡&quot;具的使用
  8. maven 学习---使用Maven构建项目
  9. switch实现成绩打等级
  10. 第 33课 C++中的字符串(上)