卜若的代码笔记系列-Web系列-SpringBoot-第九章:使用c#上传表单-3209



1.首先,c#向web服务上传数据其实是通过一个
HttpWebRequest对象,这个对象不是通过new出来的,是通过建立url连接产生的对象,我们可以这样

HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
//url指的是你请求的服务器路由,比如我这个:
http://localhost:8080/file/save

它是服务器里面负责解决提交数据的策略

@RestController
@RequestMapping("/file")
public class FileController {
    
    
    @PostMapping(value ="/save")
    public void outSave() throws IOException
    {
        ServletRequestAttributes servletRequestAttributes =         
(ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = servletRequestAttributes.getRequest();
        HttpServletResponse response = servletRequestAttributes.getResponse();
        int len = request.getContentLength();  
        System.out.println(request.getContentType()+request.getParameter("author"));  
       
    }
}


     

我们通过这个对象可以向服务器写流,然后服务器可以接收到这些流。我们可以通过

Stream stream = request.GetRequestStream();
stream.Write(data, 0, data.Length);


向服务器直接写数据,然后服务器就能够接收到,实际上,这两句代码下面代表着非常复杂的传输底层,然而,身为web程序员,其实
绝大部分情况下我们并不需要关心,你只需要知道可以通过这种方式将数据上传到服务器就行了。


接下来,我们需要准备数据

我们通过一个字典来存储我们的数据,但是将字典的数据组装字符串并且write给服务器时,我们需要注意一个细节
数据的分隔符使用"&"
这个分隔符是srpingboot它自带的一个request.getParameter("arg");约定的分隔符。

我们来看我们组装的格式          

            string buffer = "";

            foreach (string key in parameters.Keys)
            {
                buffer += key + "=" + parameters[key] + "&";
            }


这种格式其实是仿照json来的,这里不做详细赘述
接下来,通过utf-8编码将数据编码成byte流
 

byte[] data = Encoding.UTF8.GetBytes(buffer);


 
 然后write。就能实现表单的传输
 
 完整的代码:
 
       

public static HttpWebResponse CreatePostHttpResponse(string url, IDictionary<string, string> paraDic)
        {
            HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
            request.Method = "POST";
            request.ContentType = "application/x-www-form-urlencoded";
            string buffer = "";
            foreach (string key in paraDic.Keys)
            {
                buffer += key + "=" + paraDic[key] + "&";
            }
            byte[] data = Encoding.UTF8.GetBytes(buffer);
            Stream stream = request.GetRequestStream();
            stream.Write(data, 0, data.Length);
            return request.GetResponse() as HttpWebResponse;
        }

测试:

        

static void Main(string[] args)
        {
                
            IDictionary<string, string> parameters = new Dictionary<string, string>();
            parameters.Add("author", "你是傻逼");
            parameters.Add("author1", "你是傻逼");
            HttpWebResponse response = Program.CreatePostHttpResponse("http://localhost:8080/file/save", parameters);
          
        }


        
结果:
图片: