まず、背景を使用します
このプロジェクトでは、私たちはしばしば状況が時々ファイル転送を含め、複数のドッキングシステムのデータを必要と遭遇します。唯一のデータが同じデータベースサーバ上の、複数のシステムやデータベースをドッキングした場合、我々は、データ共有の目的を達成するためのOracleシノニムを使用することができます。何より一般的であることは、追加の助けを借りずに、異なるサーバ上で実行されている別のアプリケーションを有効にするには、Webサービス技術である、サードパーティ製のソフトウェアやハードウェアを専門に、あなたは、データの相互交流の目的を達成することができます。
私はまだ、Webサービス技術を公開していないので、それはHttpClientをすることにより同様のWebサービス技術データ交換インタフェースを達成することになりました。そして、これはまた、成功した送信を実践を通して、ファイルを転送し、最終的にする必要があり、ここに記録されています。
第二に、サーバがデータを送信します
図1に示すように、アクセス経路アップ正常コントローラセットを書き込みます。
2、アクセスにログインすることなく、すなわち、ログイン認証、からこのアクセスパスを設定します。
3は、サービスコールを確保するために、ビジネスロジックを書くには、相互に通常のビジネス・ロジックを通過するためのコード、検証のみサービスコールのコードを合意することができます。
コード例:
/**
* 发送普通数据接口
* @param serviceCode 服务调用码
* @return 数据JSON对象
* @author zhoujin
* @date 2018-8-27
*/
@RequestMapping(value = "sendZbsmbList")
@ResponseBody
public JSONObject sendZbsmbList(String serviceCode){
JSONObject result = new JSONObject();
// 1.获取设定的服务调用码(从属性文件中读取)
String currentCode = Global.getConfig("zbsmbServiceCode");
if (currentCode.equals(serviceCode)) {
// 2.获取需要发送的数据列表
JSONArray jsonList = new JSONArray();
……
// 3.设定返回参数
result.put("success", true);
result.put("data", jsonList);
result.put("message", "数据请求成功!");
} else {
result.put("success", false);
result.put("message", "服务调用码错误!");
}
return result;
}
/**
* 发送文件数据接口
* @param fileId 文件ID
* @param serviceCode 服务调用码
* @return 文件内容
* @author zhoujin
* @throws IOException
* @date 2018-8-27
*/
@RequestMapping(value = "sendZbsmbStream")
public void sendZbsmbStream(String fileId, String serviceCode,HttpServletRequest request, HttpServletResponse response) throws IOException{
InputStream inStream = null;
// 0.获取HTTP输出流,数据将通过该输出流发送出去
ServletOutputStream outStream = response.getOutputStream();
response.setContentType("text/html;charset=utf-8");
// 1.获取设定的服务调用码(从属性文件中读取)
String currentCode = Global.getConfig("zbsmbServiceCode");
if (currentCode.equals(serviceCode)) {
// 2.获取该文件输入流
Map<String, String> map = new HashMap<String, String>();
map.put("id", fileId);
map.put("storagetype", shareFile.getStoragetype());
try {
inStream = fileService.downloadFile(map);
byte[] buf = new byte[1024 * 10];
int len = -1;
while((len = inStream.read(buf)) != -1){
outStream.write(buf, 0, len);
outStream.flush();
}
} catch (Exception e) {
response.setContentLength(-1);
e.printStackTrace();
} finally {
if (inStream != null) {
inStream.close();
}
if (outStream != null) {
outStream.close();
}
}
}else{
response.sendError(801, "服务调用码错误!"); // 自定义状态码
return null;
}
}
第三に、クライアントがデータを受信し、
図1に示すように、目標捕捉のHttpClient、アクセス経路やパラメータ設定を設定します。
図2は、のHttpResponse、前記データオブジェクトを取得しHttpEntityを取得、送信要求を行います。
図3に示すように、解析されたデータ。
コード例:
/* 部分导包情况 */
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
/* Test-1 */
public static void getZbsmbList() throws Exception{
// 1.获取HttpClient对象
HttpClient httpclient = HttpClients.createDefault();
// 2.设定访问路径
HttpPost httppost = new HttpPost("http://localhost:9999/sendZbsmbList");
httppost.setHeader("Accept-Encoding", "identity");
// 3.设定参数
List<NameValuePair> nvps = new ArrayList<NameValuePair>();
nvps.add(new BasicNameValuePair("serviceCode", "csxt@zj_hqfusj")); // 参数名-数据
httppost.setEntity(new UrlEncodedFormEntity(nvps));
// 4.执行,发送请求
String str = "";
HttpResponse resultRep = httpclient.execute(httppost);
if (resultRep.getStatusLine().getStatusCode() == 200) {
// 5.获取传输的数据并解析
str = EntityUtils.toString(resultRep.getEntity());
if (StringUtils.isNotBlank(str)) {
……
}
} else {
System.out.println("服务访问失败!");
}
}
/* Test-2 */
public static void getZbsmbStream1() throws Exception{
// 1.获取HttpClient对象
HttpClient httpclient = HttpClients.createDefault();
// 2.设定访问路径
HttpPost httppost = new HttpPost("http://localhost:9999/sendZbsmbStream");
// 3.设定参数
List<NameValuePair> nvps = new ArrayList<NameValuePair>();
nvps.add(new BasicNameValuePair("fileId", "2ad4ec1fbf2048f3b12c089454cd901b")); // 参数名-数据
nvps.add(new BasicNameValuePair("serviceCode", "csxt@zj_hqfusj")); // 参数名-数据
httppost.setEntity(new UrlEncodedFormEntity(nvps));
// 4.执行,发送请求
HttpResponse resultRep = httpclient.execute(httppost);
int statusCode = resultRep.getStatusLine().getStatusCode();
if (statusCode == 200) {
// 5.获取传输的数据并解析
HttpEntity httpEntity = resultRep.getEntity();
// 6.将HTTP中返回实体转化为输入流
InputStream inStream = httpEntity.getContent();
FileOutputStream outStream = new FileOutputStream(new File("F:\\TestService\\testService.zip"));
byte[] buf = new byte[1024 * 10];
int len = -1;
while((len = inStream.read(buf)) != -1){
outStream.write(buf, 0, len);
}
inStream.close();
outStream.close();
System.out.println("文件输出结束!");
} else {
String result = EntityUtils.toString(resultRep.getEntity());
System.out.println(result.substring(result.indexOf("<h1>") + 4, result.indexOf("</h1>")));
}
}