前段时间接到一个需求,对接一个C#写的工具类,给我们的系统后台上传数据。
需求不难,很常见,于是为了方便。我就这样写了(java框架SSH):
C#模拟请求的代码
public static void Main(string[] args)
{
String postData = fileToString("D:\\test\\json.txt");
Console.WriteLine(postData);
string url = "ip:端口/项目名/tensionGroution.do?method=uploadData&data=" + postData;
Console.WriteLine("******************************************");
if (postData != null)
PostUrl(url, postData);
Console.ReadKey();
}
public static string PostUrl(string url, string postData)
{
string result = "";
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
req.KeepAlive = false;
req.ProtocolVersion = HttpVersion.Version10;
req.Method = "POST";
req.Timeout = 80000;//设置请求超时时间,单位为毫秒
req.ContentType = "application/json";
byte[] data = Encoding.UTF8.GetBytes(postData);
req.ContentLength = data.Length;
using (Stream reqStream = req.GetRequestStream())
{
reqStream.Write(data, 0, data.Length);
reqStream.Close();
}
HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
Stream stream = resp.GetResponseStream();
//获取响应内容
using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
{
result = reader.ReadToEnd();
}
Console.WriteLine(postData);
return result;
}
public static string fileToString(String filePath)
{
if (!File.Exists(filePath))
{
Console.WriteLine("文件不存在");
return null;
}
string strData = "";
try
{
string line;
// 创建一个 StreamReader 的实例来读取文件 ,using 语句也能关闭 StreamReader
using (System.IO.StreamReader sr = new System.IO.StreamReader(filePath, System.Text.Encoding.GetEncoding("gb2312")))
{
// 从文件读取并显示行,直到文件的末尾
while ((line = sr.ReadLine()) != null)
{
//Console.WriteLine(line);
strData += line;
}
}
}
catch (Exception e)
{
// 向用户显示出错消息
Console.WriteLine("The file could not be read:");
Console.WriteLine(e.Message);
}
return strData;
}
}
提供上传路径,并且携带参数(json格式),通过C#的HttpWebRequest对象模拟了http的post请求。请求正常发送。
java后台也接收到了,接受方式是很常见的 : String data = request.getParameter("data");
ok完成部署,测试无误。 但是用了一段时间后,问题来了
C#后台居然报错了
排查原因 原来是请求接口的参数惹的祸
当拼接的参数过长的 请求协议拒绝发送,所以报了错。
解决方案:
在C#模拟请求的代码了发现这样一个类,其实已将操作了参数。
Stream 这个对象其实已经将参数以流的形式写入到请求中了,之前的操作并没有用。
了解到了Stream的原理之后,那么就改变了请求接口,不去携带参数,Stream对象去处理。
string url = "ip:端口/项目名/tensionGroution.do?method=uploadData";(修改后的接口)。
然后java后台接受这个参数也要处理了,显然就是读流了。
String tradeInfos = "";
BufferedReader bufferedReader = new BufferedReader(
new InputStreamReader(request.getInputStream(), "utf-8")); // 读取参数流
String nextLine = bufferedReader.readLine();
while (nextLine != null) {
System.out.println(request.getCharacterEncoding());
tradeInfos += nextLine;
nextLine = bufferedReader.readLine();
}
System.out.println(tradeInfos);
这样,就顺利的得到了C#工具上传的数据的。
当然也有别的请求 和接受的方式,找一个最合适的才是最好的!!