zoukankan      html  css  js  c++  java
  • c# 模拟web请求formdata webrequest

    前言

    在写代码中,我们常常需要去书写代码去请求一些东西,那么是不是可以模拟像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("
    --" + boundary + "
    ");
    				var endBoundary = Encoding.ASCII.GetBytes("
    --" + boundary + "--
    ");
    				request.ContentType = "multipart/form-data; boundary=" + boundary;                       
    
    				var strBuf = new StringBuilder();
    				foreach (var key in data.Keys)
    				{
    					strBuf.Append("
    --" + boundary + "
    ");
    					strBuf.Append("Content-Disposition: form-data; name="" + key + ""
    
    ");
    					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}"
    " +
    							"Content-Type: application/octet-stream
    
    ";
    						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;
    	}
    }
    }
    }
    
  • 相关阅读:
    我的word发布博客测试
    framework源码调试
    微软发布各个阶段的发布程序
    ora9客户端字符集
    现知道一服务器有合法ip,现在在远端应如何连接到这个服务器访问
    布式Oracle的database link
    怎样用delphi7中的SQLconnection组件远程连接Oracle数据库
    不用安装oracle客户端使用oracle
    有关linux下远程连接(转)
    如何限制某个用户只能FTP不能TELNET?
  • 原文地址:https://www.cnblogs.com/aoximin/p/13230803.html
Copyright © 2011-2022 走看看