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); }
结果:
图片: