前言

在写代码中,我们常常需要去书写代码去请求一些东西,那么是不是可以模拟像web formdata一样请求。

正文

下面代码为模拟的:

public string SendRequest(string url, ref Dictionary<string, object> data, HttpMethod requestMethod,ref Dictionary<string, string> header, int timeOut, string localPath = null, long offset = -1, int sliceSize = 0)
{
//url = "http://localhost:54257/Home/getdata";
try
{
System.Net.ServicePointManager.Expect100Continue = false;
if (requestMethod == HttpMethod.Get)
{
var paramStr = "";
foreach (var key in data.Keys)
{
paramStr += string.Format("{0}={1}&", key, HttpUtility.UrlEncode(data[key].ToString()));
}
paramStr = paramStr.TrimEnd('&');
url += (url.EndsWith("?") ? "&" : "?") + paramStr;
} HttpWebRequest request; request = (HttpWebRequest)HttpWebRequest.Create(url);
request.Accept = CosDefaultValue.ACCEPT;
request.KeepAlive = true;
request.UserAgent = CosDefaultValue.USER_AGENT_VERSION;
request.Timeout = timeOut;
foreach (var key in header.Keys)
{
if(key == "Content-Type")
{
request.ContentType = header[key];
}
else
{
request.Headers.Add(key, header[key]);
}
}
if (requestMethod == HttpMethod.Post)
{
request.Method = requestMethod.ToString().ToUpper();
var memStream = new MemoryStream();
if (header.ContainsKey("Content-Type") && header["Content-Type"] == "application/json")
{
var json = JsonConvert.SerializeObject(data);
var jsonByte = Encoding.GetEncoding("utf-8").GetBytes(json.ToString());
memStream.Write(jsonByte, 0, jsonByte.Length);
}
else
{
var boundary = "---------------" + DateTime.Now.Ticks.ToString("x");
var beginBoundary = Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n");
var endBoundary = Encoding.ASCII.GetBytes("\r\n--" + boundary + "--\r\n");
request.ContentType = "multipart/form-data; boundary=" + boundary; var strBuf = new StringBuilder();
foreach (var key in data.Keys)
{
strBuf.Append("\r\n--" + boundary + "\r\n");
strBuf.Append("Content-Disposition: form-data; name=\"" + key + "\"\r\n\r\n");
strBuf.Append(data[key].ToString());
}
var paramsByte = Encoding.GetEncoding("utf-8").GetBytes(strBuf.ToString());
memStream.Write(paramsByte, 0, paramsByte.Length);
if (localPath != null)
{
memStream.Write(beginBoundary, 0, beginBoundary.Length);
var fileInfo = new FileInfo(localPath);
using (var fileStream = new FileStream(localPath, FileMode.Open, FileAccess.Read))
{
const string filePartHeader =
"Content-Disposition: form-data; name=\"fileContent\"; filename=\"{0}\"\r\n" +
"Content-Type: application/octet-stream\r\n\r\n";
var headerText = string.Format(filePartHeader, fileInfo.Name);
var headerbytes = Encoding.UTF8.GetBytes(headerText);
memStream.Write(headerbytes, 0, headerbytes.Length); if (offset == -1)
{
var buffer = new byte[1024];
int bytesRead;
while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)
{
memStream.Write(buffer, 0, bytesRead);
}
}
else
{
var buffer = new byte[sliceSize];
int bytesRead;
fileStream.Seek(offset, SeekOrigin.Begin);
bytesRead = fileStream.Read(buffer, 0, buffer.Length);
memStream.Write(buffer, 0, bytesRead);
}
}
}
memStream.Write(endBoundary, 0, endBoundary.Length);
}
request.ContentLength = memStream.Length;
var requestStream = request.GetRequestStream();
memStream.Position = 0;
var tempBuffer = new byte[memStream.Length];
memStream.Read(tempBuffer, 0, tempBuffer.Length);
memStream.Close(); requestStream.Write(tempBuffer, 0, tempBuffer.Length);
requestStream.Close(); //Console.WriteLine(strBuf.ToString());
}
//Console.WriteLine(request.ContentType.ToString());
var response = request.GetResponse();
using (var s = response.GetResponseStream())
{
var reader = new StreamReader(s, Encoding.UTF8);
var rsp_data = reader.ReadToEnd();
if (response != null)
{
response.Close();
}
return rsp_data;
}
}
catch (WebException we)
{
if (we.Status == WebExceptionStatus.ProtocolError)
{
using (var s = we.Response.GetResponseStream())
{
var reader = new StreamReader(s, Encoding.UTF8);
return reader.ReadToEnd();
}
}
else
{
throw we;
}
}
catch (Exception e)
{
throw e;
}
}
}
}

c# 模拟web请求formdata webrequest的更多相关文章

  1. 经验总结20--C#模拟WEB请求

    非常多语言能够使用代码进行WEB请求,获取到须要的数据. 方便调用别人的接口,自己进行处理. HttpWebRequest request = WebRequest.Create(url) as Ht ...

  2. [System.Net]模拟Web请求编写简易单词查询客户端

    demo: 我就不上传了 前言 在实际生活中,网络请求的应用极其常见,比如使用浏览器,程序中我们还要调用webservice.那么浏览器是怎么请求网络资源的呢?不用它可以自己请求不? 答案是可以的. ...

  3. C#模拟httpwebrequest请求_向服务器模拟cookie发送

    使用C#代码模拟web请求,是一种常用的方法,以前没专门整理过,这里暂时贴上自己整理的完整代码,以后再做梳理: public class MyRequest { #region 辅助方法 public ...

  4. js_html_input中autocomplete="off"在chrom中失效的解决办法 使用JS模拟锚点跳转 js如何获取url参数 C#模拟httpwebrequest请求_向服务器模拟cookie发送 实习期学到的技术(一) LinqPad的变量比较功能 ASP.NET EF 使用LinqPad 快速学习Linq

    js_html_input中autocomplete="off"在chrom中失效的解决办法 分享网上的2种办法: 1-可以在不需要默认填写的input框中设置 autocompl ...

  5. 模拟HTTP请求:Request Maker

    摘要 : Request Maker是一款可以模拟HTTP请求的谷歌浏览器插件. Request Maker的开发背景 现在由于restful式的web api的兴起,越来越多的开发者习惯使用URL来 ...

  6. 第三百二十七节,web爬虫讲解2—urllib库爬虫—基础使用—超时设置—自动模拟http请求

    第三百二十七节,web爬虫讲解2—urllib库爬虫 利用python系统自带的urllib库写简单爬虫 urlopen()获取一个URL的html源码read()读出html源码内容decode(& ...

  7. 六 web爬虫讲解2—urllib库爬虫—基础使用—超时设置—自动模拟http请求

    利用python系统自带的urllib库写简单爬虫 urlopen()获取一个URL的html源码read()读出html源码内容decode("utf-8")将字节转化成字符串 ...

  8. 模拟web服务器http请求应答

    我们在浏览器打开网页,其实是向远端服务器提出页面发送请求,远端服务器在接到请求后,就开始执行请求页面的程序文件,然后将执行结果通过html格式,发送到你的浏览器,再显示出来.以下用百度(www.bai ...

  9. 007-优化web请求三-异步调用【WebAsyncTask】

    一.什么是同步调用 浏览器发起请求,Web服务器开一个线程处理,处理完把处理结果返回浏览器.好像没什么好说的了,绝大多数Web服务器都如此般处理.现在想想如果处理的过程中需要调用后端的一个业务逻辑服务 ...

  10. C# 通过模拟http请求来调用soap、wsdl

    C#调用webservice的方法很多,我说的这种通过http请求模拟来调用的方式是为了解决C#调用java的远程API出现各种不兼容问题. 由于远程API不在我们的控制下,我们只能修改本地的调用代码 ...

随机推荐

  1. shell脚本中将 IFS (Internal Field Separator 内部字段分隔符)替换为换行符

    将 IFS 中的空白符(换行.制表符.空格)修改为仅包含换行 IFS 是shell中的内部变量,在使用 for var in var_list;do use $var do something don ...

  2. max30100心率血氧健康传感器调试总结备忘

    前记  在健康监测领域,心率血氧传感器是一个非常重要的前端采集设备.了解,研究并使用它,是一个方案商的基本素质.鉴于此,笔者花了一些时间在不同的硬件平台来使用它.中间遇到了一些问题值得总结和反思一下. ...

  3. ypipe, zmq的核心部件,无锁读写的管道。

    必须指出,无锁读写只限于单个读跟单个写之间,读与读,还有写与写之间必须确保同步.所以ypipe不必读写锁rwlock或者读写之间的锁,但需要读锁跟写锁两个锁,在读端之间或在写端之间仍然是临界资源.本质 ...

  4. 【leetcode 春季比赛3题 二叉搜索树染色】广度搜索

    暴力: import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import ja ...

  5. JAVA 相关

    1.  google guava  cache 2. presto 3. loadingcache 4. aspect

  6. 01.Android崩溃Crash封装库

    目录介绍 01.该库具有的功能 02.该库优势分析 03.该库如何使用 04.降低非必要crash 05.异常恢复原理 06.后续的需求说明 07.异常栈轨迹原理 08.部分问题反馈 09.其他内容说 ...

  7. 崩溃bug日志总结2

    目录介绍 1.1 java.lang.ClassNotFoundException类找不到异常 1.2 java.util.concurrent.TimeoutException连接超时崩溃 1.3 ...

  8. JavaScript知识总结 异步编程篇

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 1. 异步编程的实现方式? JavaScript中的异步机制可以分为以下几种: 回调函数 的方式,使用回调函数的方式有一个缺点是,多个回调 ...

  9. MySQL报语法错误,排查竟然花了一个钟!!!!

    背景:最近协助远程同事开发一个功能,我调用同事写的接口,出现报错,影响和前端联调,同事正在处理其他事情,暂时无暇顾及.遂自行解决.查看日志现发一个inser语句报语法错误. 异常日志: bad SQL ...

  10. Loto实践干货(3) 测量CAN总线通讯数据

    Loto实践干货(3) 测量CAN总线通讯数据 最近在做运动控制卡的项目,调试样机的过程中,需要验证CAN总线通讯功能的正确性.以前只限于理论上认识CAN总线,使用的CANbus的通讯卡也是有上位机例 ...