項目中用戶提出了新要求,把本來在項目內平台內發送的信息同時發送到手機上,好在他們已經有了短信的發送平台,只要調用其接口發送就可以了。
短信發送接口是用JSP實現的一個網頁,調用方式是以Post方式向該網頁發送數據。
在網絡上查找資料,幾乎都是同一個結果:
System.Net.WebRequest req = System.Net.WebRequest.Create(URI);
req.Proxy = new System.Net.WebProxy(ProxyString, true);
再根據用戶給定的接口說明和Java例子修改,結果總是返回的結果是亂碼,再到網上查,說是編碼方式的問題,那沒有辦法了,只有多方嘗試了。經過近一天的不斷試驗,終於成功了。我的正確的代碼如下:
protected string SendMsg(string XMLMsg)
{
string urlPage = "http://www.handtimes.com/interface/forSCMIS.JSP";
Stream outstream = null;
Stream instream = null;
StreamReader sr = null;
HttpWebResponse response = null;
HttpWebRequest request = null;
// 要注意的這是這個編碼方式,我嘗試了很長的時間,還有內容的XML內容的編碼方式
Encoding encoding = Encoding.GetEncoding("GBK");
byte[] data = encoding.GetBytes(XMLMsg);
// 准備請求...
// 設置參數
request = WebRequest.Create(urlPage) as HttpWebRequest;
request.Method = "POST";
// 這個地方的內容類型是接口文檔上要求的,必須是這樣的
request.ContentType = "text/plain";
request.ContentLength = data.Length;
outstream = request.GetRequestStream();
outstream.Write(data, 0, data.Length);
outstream.Flush();
outstream.Close();
//發送請求並獲取相應回應數據
response = request.GetResponse() as HttpWebResponse;
//直到request.GetResponse()程序才開始向目標網頁發送Post請求
instream = response.GetResponseStream();
sr = new StreamReader(instream, encoding);
//返回結果網頁(Html)代碼
string content = sr.ReadToEnd();
return content;
}
要說明的是,發送時地數據的編碼和發送的內容(XML)的編碼都是使用的GBK編碼時成功了,
因為用戶給我的帳號不能發送到我自己的手機上,所以我不敢進行太多的嘗試,成功後就沒有再繼續嘗試,不知道影響返回的內容是亂碼的是哪一個編碼,還是兩個都影響。
req.ContentType = "application/x-www-form-urlencoded";
req.Method = "POST";
byte [] bytes = System.Text.Encoding.ASCII.GetBytes(Parameters);
req.ContentLength = bytes.Length;
System.IO.Stream os = req.GetRequestStream ();
os.Write (bytes, 0, bytes.Length);
os.Close ();
System.Net.WebResponse resp = req.GetResponse();
if (resp== null) return null;
System.IO.StreamReader sr = new System.IO.StreamReader(resp.GetResponseStream());
return sr.ReadToEnd().Trim();