5. 服务调用开发DEMO
5.1 JAVA-SOAP
本章节介绍三种生成调用总线SOAP接口的方式,第一种以eclipse生成客户端代码为例,第二种以CXF wsdl2java生成客户端代码为例,第三种myeclipse生成客户端代码为例,样例以“
获取用户基本信息
”的webservice来进行说明。
5.1.1 示例1:EMAP直接调用
公网上的开发人员,EMAP中调用API之前,先删除app_info.xml 中的开发证书,如下图红框位置。
- 创建自定义动作“获取用户信息”
2、首先,把soap接口地址粘贴到“服务地址”,点击输入框
刷新按钮,则方法列表自动展现该soap接口可调用的方法,鼠标点击各个方法,参数列表中自动刷新显示该方法的入参与出参。方法列表勾选代表,该动作调用soap接口的勾选中的方法。每个动作有且只能选择一个方法。
其次,确认右上角勾选WISEDU服务总线,默认勾选。如果是调用非服务总线接口,去掉此选项。
再次,在header中添加开发测试时接口的appId与accessToken两个参数。
使用xml编辑器打开自定义动作
源文件中所有urlStart中地址参数修改成总线访问地址中的域名。
- 调用
在动作流中调用:
在前端代码中调用:
5.1.2 示例2:eclipse生成客户端代码并调用接口
生成客户端代码
在eclipse中选择 新建 -> 其它
出现如下对话框,选择Web Service Client,创建一个ws客户端
出现如下对话框,将url复制进文本框
点击next,选择代码生成的位置
然后点击完成(finish)即可生成ws客户端代码,如下:
webservice的调用
获取到实现类之后即可调用webservice中的方法, 样例代码如下:
创建客户端调用测试类ClientTest.java,在ClientTest.java的main方法里面进行调用代码测试:
代码如下(说明:上述代码中,在开发时请将服务地址url、appId和accessToken信息按实际情况填写,核心jar包:axis.jar、commons-discovery-0.2.jar、commons-logging.jar、jaxrpc.jar、saaj.jar、wsdl4j.jar):
import java.net.MalformedURLException;
import java.rmi.RemoteException;
import com.wisedu.mdbservice.api.ws.identity.IdsRequest;
import com.wisedu.mdbservice.api.ws.identity.RedisInfoNew;
import com.wisedu.mdbservice.api.ws.identity.UserInfoNewResponse;
import com.wisedu.mdbservice.web.api.impl.identity.UserInfoAPIImplServiceSoapBindingStub;
public class ClientTest {
public static void main(String[] args) throws MalformedURLException, RemoteException {
// WSDL请求地址
java.net.URL url = new java.net.URL(
"http://172.16.7.124:8080/mdm_UserInfoAPIImplService/ProxyService/UserInfoAPIImplServiceProxyService?wsdl");
UserInfoAPIImplServiceSoapBindingStub stub = new UserInfoAPIImplServiceSoapBindingStub(url, null);
// appId accessToken Header头文件信息传入
stub.setHeader("", "appId", "amp");
stub.setHeader("", "accessToken", "9FB95D66318F36BB00D840E107284CDF");
// 业务参数传入
IdsRequest ir = new IdsRequest();
ir.setIds(new String[] { "ampadmin" }); //数組格式的人员id
// 接口方法调用(getUsersInfoByIds)
UserInfoNewResponse u = stub.getUsersInfoByIds(ir);
// 接口返回数据的解析
RedisInfoNew[] redisInfos = u.getRedisInfo();
for (RedisInfoNew redisInfo : redisInfos) {
System.out.println(redisInfo.getId() + ":" + redisInfo.getName());
}
}
}
以上是调用接口中getUsersInfoByIds的方法,此方法中传参是个IdsRequest对象,对象中setIds是具体人员id的数组。方法返回RedisInfoNew[]对象,解析一下我们可以得到以下结果:
5.1.3 示例3:myeclipse 生成客户端代码并调用接口
生成客户端代码
右击项目新建 -> 其它
新建窗口如下:
点击next,进入下一步,出现如下对话框,将url复制进文本框:
点击next,进入下一步:
直接finish,完成,生成客户端代码
添加soap header赋值类AddSoapHeader.java
依赖核心jar包:Cxf-2.7.3.jar(或者更高的版本)
import java.util.List;
import java.util.Map;
import javax.xml.namespace.QName;
import org.apache.cxf.binding.soap.SoapHeader;
import org.apache.cxf.binding.soap.SoapMessage;
import org.apache.cxf.binding.soap.interceptor.AbstractSoapInterceptor;
import org.apache.cxf.headers.Header;
import org.apache.cxf.helpers.DOMUtils;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.phase.Phase;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
public class AddSoapHeader extends AbstractSoapInterceptor {
public static final String xml_name_uri = "";
public static final String xml_appId_el = "appId";
public static final String xml_serviceId_el = "serviceId";
public static final String xml_accessToken_el = "accessToken";
private String appId = "";
private String serviceId = "";
private String accessToken = "";
public AddSoapHeader(Map<String, Object> headers) {
super(Phase.WRITE);
for (String key : headers.keySet()) {
if (key.equals("appId")) {
this.appId = (String) headers.get("appId");
}
if (key.equals("serviceId")) {
this.serviceId = (String) headers.get("serviceId");
}
if (key.equals("accessToken")) {
this.accessToken = (String) headers.get("accessToken");
}
}
}
public void handleMessage(SoapMessage message) throws Fault {
Document doc = (Document) DOMUtils.createDocument();
Element appId = doc.createElement(xml_appId_el);
appId.appendChild(doc.createTextNode(this.appId));
Element serviceId = doc.createElement(xml_serviceId_el);
serviceId.appendChild(doc.createTextNode(this.serviceId));
Element accessToken = doc.createElement(xml_accessToken_el);
accessToken.appendChild(doc.createTextNode(this.accessToken));
Element root = doc.createElementNS(xml_name_uri,
"tns:RequestSOAPHeader");
root.appendChild(appId);
root.appendChild(serviceId);
root.appendChild(accessToken);
SoapHeader head = new SoapHeader(new QName("RequestSOAPHeader"), root);
List<Header> headers = message.getHeaders();
headers.add(head);
}
}
webservice的调用
获取到实现类之后即可调用webservice中的方法, 样例代码如下:
创建客户端调用测试类ClientTest.java,在ClientTest.java的main方法里面进行调用代码测试:
代码如下(说明:上述代码中,在开发时请将服务地址url、appId和accessToken信息按实际情况填写,依赖核心jar包:Cxf-2.7.3.jar(或者更高的版本)、xmlschema-core-2.0.3.jar、neethi-3.0.2.jar、commons-logging-1.1.2.jar、wsdl4j-1.6.3.jar、httpcore-nio-4.2.2.jar、httpasyncclient-4.0-beta3.jar、httpcore-4.2.2.jar、httpclient-4.2.1.jar):
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.cxf.interceptor.Interceptor;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
import org.apache.cxf.message.Message;
import com.wisedu.mdbservice.api.ws.identity.IdsRequest;
import com.wisedu.mdbservice.api.ws.identity.UserConnectInfo;
import com.wisedu.mdbservice.api.ws.identity.UsersConnectInfoResponse;
import com.wisedu.mdbservice.web.api.impl.identity.UserInfoAPI;
public class ClientTest {
public static void main(String[] args) {
// WSDL请求地址
JaxWsProxyFactoryBean jaxWsProxyFactoryBean = new JaxWsProxyFactoryBean();
jaxWsProxyFactoryBean
.setAddress("http://172.16.7.124:8080/mdm_UserInfoAPIImplService/ProxyService/UserInfoAPIImplServiceProxyService?wsdl");
// appId accessToken Header头文件信息传入
Map<String, Object> header = new HashMap<String, Object>();
header.put("appId", "amp");
header.put("accessToken", "9FB95D66318F36BB00D840E107284CDF");
AddSoapHeader addSoapHeader = new AddSoapHeader(header);
List<Interceptor<? extends Message>> list = new ArrayList<Interceptor<? extends Message>>();
list.add(addSoapHeader);
jaxWsProxyFactoryBean.setOutInterceptors(list);
// 接口实现类
jaxWsProxyFactoryBean.setServiceClass(UserInfoAPI.class);
UserInfoAPI userInfo = (UserInfoAPI) jaxWsProxyFactoryBean.create();
//业务入参
IdsRequest ir = new IdsRequest();
ir.getIds().add("ampadmin");//list 集合
//接口方法调用(getUsersConnectInfoByIds)
UsersConnectInfoResponse usersConnectInfo = userInfo.getUsersConnectInfoByIds(ir);
// 接口返回数据的解析
List<UserConnectInfo> useList = usersConnectInfo.getUserConnectInfo();
for(UserConnectInfo user : useList){
System.out.println(user.getId()+":"+user.getName());
}
}
}
以上是调用接口中getUsersConnectInfoByIds的方法,此方法中传参是个IdsRequest对象,对象中多个人员id以list的方式传递。方法返回UsersConnectInfoResponse对象,解析一下我们可以得到以下结果:
5.1.4 示例4:wsdl2java 客户端代码并调用接口
生成客户端代码
①下载cxf
http://cxf.apache.org/download.html
选择apache-cxf-3.0.5.zip
②生成代码
解压E:\apache-cxf-3.0.5
Cmd进入E:\apache-cxf-3.0.5\bin执行
wsdl2java -p com.wisedu.mdbservice -d E:\eclipseTool\src -client
③wsdl 参数说明
wsdl2java -p xxx -d xxx -client xxx
-p 指定其wsdl的命名空间,也就是要生成代码的包名:
-d 指定要产生代码所在目录
-client 生成客户端测试web service的代码
-server 生成服务器启动web service的代码
-impl 生成web service的实现代码
-ant 生成build.xml文件
-all 生成所有开始端点代码:types,service proxy,,service interface, server mainline, client mainline, implementation object, and an Ant build.xml file.
命令执行完后会在相应的位置生成客户端代码
添加soap header赋值类AddSoapHeader.java
同2.2.2
webservice的调用
同2.2.3
5.2 JAVA-RESTful
本章节介绍两种调用总线RESTful接口的方式,第一种以apache httpclient为例,第二种以原生调用为例。
5.2.1 示例1:httpclient调用
依赖jar包
commons-beanutils-1.8.3.jar
commons-collections-3.1.jar
commons-lang-2.5.jar
commons-logging-1.1.2.jar
ezmorph-1.0.3.jar
httpclient-4.1.2.jar
httpclient-cache-4.1.2.jar
httpmime-4.1.2.jar
httpcore-4.2.2.jar
json-lib-2.1.jar
客户端调用
创建客户端调用测试类Test.java,在Test.java的main方法里面进行调用代码测试:
代码如下(说明:上述代码中,在开发时请将服务地址url、appId和accessToken信息按实际情况填写,参数替换为实际的情况):以上是调用接口中getUsersConnectInfoByIds的方法,此方法中传参是个IdsRequest对象,对象中多个人员id以list的方式传递。方法返回UsersConnectInfoResponse对象,解析一下我们可以得到以下结果:
5.2.2 示例2:http原生调用
依赖jar包
commons-beanutils-1.8.3.jar
commons-collections-3.1.jar
commons-lang-2.5.jar
commons-logging-1.1.2.jar
ezmorph-1.0.3.jar
httpclient-4.1.2.jar
httpclient-cache-4.1.2.jar
httpmime-4.1.2.jar
httpcore-4.2.2.jar
json-lib-2.1.jar
客户端调用
创建客户端调用测试类Test.java,在Test.java的main方法里面进行调用代码测试:
代码如下(说明:上述代码中,在开发时请将服务地址url、appId和accessToken信息按实际情况填写,参数替换为实际的情况):
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import net.sf.json.JSONObject;
import org.apache.http.entity.StringEntity;
public class Test2 {
// api请求地址url
private static final String targetURL = "http://172.16.7.124:8080/mdm-new_cs_auth_web-restful-groupReadAPI-getGroupsByUserID/ProxyService/cs_auth_web-restful-groupReadAPI-getGroupsByUserIDProxyService";
public static void main(String[] args) {
try {
// api请求地址url
URL targetUrl = new URL(targetURL);
// 打开连接
HttpURLConnection httpConnection = (HttpURLConnection) targetUrl.openConnection();
// 参数设置
httpConnection.setDoOutput(true);
httpConnection.setRequestMethod("POST");
httpConnection.setRequestProperty("Content-Type","application/json");
// appId accessToken Header头文件信息传入
//httpConnection.setRequestProperty("serviceId", "76b313ab32c9");
httpConnection.setRequestProperty("appId", "amp");
httpConnection.setRequestProperty("accessToken","9FB95D66318F36BB00D840E107284CDF");
// 业务参数
JSONObject jsonParam = new JSONObject();
jsonParam.put("userId", "ampadmin");
StringEntity entity = new StringEntity(jsonParam.toString(), "UTF-8");// 解决中文乱码问题
entity.setContentEncoding("UTF-8");
entity.setContentType("application/json");
OutputStream outputStream = httpConnection.getOutputStream();
outputStream.write(jsonParam.toString().getBytes("UTF-8"));
outputStream.flush();
// 取得输入流,并使用Reader读取调用结果
BufferedReader responseBuffer = new BufferedReader(
new InputStreamReader((httpConnection.getInputStream())));//设置编码,否则中文乱码
String output;
while ((output = responseBuffer.readLine()) != null) {
output = new String(output.getBytes(), "UTF-8");
break;
}
responseBuffer.close();
// 断开连接
httpConnection.disconnect();
System.out.println("Output from Server:\n"+output);
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
以上是调用RESTful接口中的方法,此方法中传参通过jsonParam.put()实现。方法返回通过取得输出流,并使用Reader读取获得json格式的字符串,解析一下我们可以得到以下结果:
5.2.3 照片接口示例3:照片保存
依赖jar包
commons-beanutils-1.8.3.jar
commons-collections-3.1.jar
commons-lang-2.5.jar
commons-logging-1.1.2.jar
ezmorph-1.0.3.jar
httpclient-4.1.2.jar
httpclient-cache-4.1.2.jar
httpmime-4.1.2.jar
httpcore-4.2.2.jar
json-lib-2.1.jar
commons-io-2.0.1.jar
客户端调用
创建客户端调用测试类Test.java,在Test.java的main方法里面进行调用代码测试:
代码如下(说明:上述代码中,在开发时请将服务地址url、appId和accessToken信息按实际情况填写,参数替换为实际的情况):
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import org.apache.commons.io.FileUtils;
public class Test3 {
// api请求地址url
private static final String targetURL = "http://172.16.7.124:8080/mdm_mdb_service_web-restful-hrAPI-savePhoto/ProxyService/mdb_service_web-restful-hrAPI-savePhotoProxyService";
public static void main(String[] args) {
try {
URL targetUrl = new URL(targetURL);
// 打开连接
HttpURLConnection httpConnection = (HttpURLConnection) targetUrl.openConnection();
// 参数设置
httpConnection.setDoOutput(true);
httpConnection.setRequestMethod("POST");
httpConnection.setRequestProperty("Content-Type","application/json");
// appId accessToken Header头文件信息传入
httpConnection.setRequestProperty("appId", "amp");
httpConnection.setRequestProperty("accessToken","9FB95D66318F36BB00D840E107284CDF");
// 业务参数
SavePhotoRequest savePhotoRequest = new SavePhotoRequest();
Photo[] photo = new Photo[1];
photo[0] = new Photo();
photo[0].setId("ljwan");
photo[0].setType(3);//1小标准照 2大标准照 3生活照
photo[0].setUrl("/ljwan/33");
byte[] photoByte = FileUtils.readFileToByteArray(new File("D:\\我的新工作文件夹\\我的资料\\我的介绍\\照片1-万陆俭.jpg"));
photo[0].setZp(photoByte);
savePhotoRequest.setPhotos(photo);
OutputStream outputStream = httpConnection.getOutputStream();
outputStream.write(JsonUtils.toJson(savePhotoRequest).getBytes("UTF-8"));// 解决中文乱码问题
outputStream.flush();
if (httpConnection.getResponseCode() != 200) {
throw new RuntimeException("Failed : HTTP error code : "
+ httpConnection.getResponseCode());
}
// 取得输入流,并使用Reader读取调用结果
BufferedReader responseBuffer = new BufferedReader(
new InputStreamReader((httpConnection.getInputStream())));
String output;
System.out.println("Output from Server:\n");
while ((output = responseBuffer.readLine()) != null) {
System.out.println(output);
}
httpConnection.disconnect();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
以上调用方法中用到三个依赖类,分别为:JsonUtils、Photo、SavePhotoRequest,代码分别见附录。执行以上调用我们可以得到以下结果:
附录
Photo
public class Photo {
private byte[] zp;
private String id;
private String url;
private int type;// sizeType
public byte[] getZp() {
return zp;
}
public void setZp(byte[] zp) {
this.zp = zp;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
}
JsonUtils
import java.util.Collection;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
public class JsonUtils {
private JsonUtils() {
super();
}
public static <T> String toJson(T o) {
String s = "";
if (o == null) {
return s;
}
if (o instanceof Collection || o.getClass().isArray()) {
s = JSONArray.fromObject(o).toString();
} else {
s = JSONObject.fromObject(o).toString();
}
return s;
}
}
SavePhotoRequest
public class SavePhotoRequest{
Photo[] photos;
public Photo[] getPhotos() {
return photos;
}
public void setPhotos(Photo[] photos) {
this.photos = photos;
}
}
5.2.4 照片接口示例4:获取照片URL
依赖jar包
commons-beanutils-1.8.3.jar
commons-collections-3.1.jar
commons-lang-2.5.jar
commons-logging-1.1.2.jar
ezmorph-1.0.3.jar
httpclient-4.1.2.jar
httpclient-cache-4.1.2.jar
httpmime-4.1.2.jar
httpcore-4.2.2.jar
json-lib-2.1.jar
commons-io-2.0.1.jar
客户端调用
创建客户端调用测试类Test.java,在Test.java的main方法里面进行调用代码测试:
代码如下(说明:上述代码中,在开发时请将服务地址url、appId和accessToken信息按实际情况填写,参数替换为实际的情况):
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
public class Test4_2 {
// api请求地址url
private static final String targetURL = "http://172.16.7.124:8080/mdm_mdb_service_web-restful-hrAPI-getPhotoById/ProxyService/mdb_service_web-restful-hrAPI-getPhotoByIdProxyService";
public static void main(String[] args) {
try {
// api请求地址url
URL targetUrl = new URL(targetURL);
// 打开连接
HttpURLConnection httpConnection = (HttpURLConnection) targetUrl.openConnection();
// 参数设置
httpConnection.setDoOutput(true);
httpConnection.setRequestMethod("POST");
httpConnection.setRequestProperty("Content-Type","application/json");
// appId accessToken Header头文件信息传入
//httpConnection.setRequestProperty("serviceId", "cb265d6abcd9");
httpConnection.setRequestProperty("appId", "amp");
httpConnection.setRequestProperty("accessToken","9FB95D66318F36BB00D840E107284CDF");
// 业务参数
PhotoRequest photoRequest = new PhotoRequest();
String []ids = {"ljwan"};
photoRequest.setIds(ids);
photoRequest.setResultType(1);//1获取照片地址 2获取照片blob
photoRequest.setSizeType(3);//1小标准照 2大标准照 3生活照
OutputStream outputStream = httpConnection.getOutputStream();
outputStream.write(JsonUtils.toJson(photoRequest).getBytes("UTF-8"));
outputStream.flush();
if (httpConnection.getResponseCode() != 200) {
throw new RuntimeException("Failed : HTTP error code : "
+ httpConnection.getResponseCode());
}
// 取得输入流,并使用Reader读取调用结果
BufferedReader responseBuffer = new BufferedReader(
new InputStreamReader((httpConnection.getInputStream())));
String output;
while ((output = responseBuffer.readLine()) != null) {
output = new String(output.getBytes(), "UTF-8");
break;
}
httpConnection.disconnect();
//解析获取照片url
System.out.println("Output from Server:");
JSONObject jb = JSONObject.fromObject(output);
JSONArray ja = JSONArray.fromObject(jb.get("photos"));
for(int i=0;i<ja.size();i++){
System.out.println("获取照片地址为:"+JSONObject.fromObject(ja.get(i)).get("url"));
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
以上调用方法中用到四个依赖类,分别为:PhotoRequest、JsonUtils、BaseRequest、Page,代码分别见附录。执行以上调用我们可以得到以下结果:
附录
Page
public class Page {
private int pageSize;
private int pageNum;
private String order;
private String orderBy;
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public int getPageNum() {
return pageNum;
}
public void setPageNum(int pageNum) {
this.pageNum = pageNum;
}
public String getOrder() {
return order;
}
public void setOrder(String order) {
this.order = order;
}
public String getOrderBy() {
return orderBy;
}
public void setOrderBy(String orderBy) {
this.orderBy = orderBy;
}
}
BaseRequest
public class BaseRequest {
private Page page;
public Page getPage() {
return page;
}
public void setPage(Page page) {
this.page = page;
}
}
PhotoRequest
public class PhotoRequest extends BaseRequest {
private String []ids;
private int sizeType;
private int resultType;
public String[] getIds() {
return ids;
}
public void setIds(String[] ids) {
this.ids = ids;
}
public int getSizeType() {
return sizeType;
}
public void setSizeType(int sizeType) {
this.sizeType = sizeType;
}
public int getResultType() {
return resultType;
}
public void setResultType(int resultType) {
this.resultType = resultType;
}
JsonUtils
import java.util.Collection;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
public class JsonUtils {
private JsonUtils() {
super();
}
public static <T> String toJson(T o) {
String s = "";
if (o == null) {
return s;
}
if (o instanceof Collection || o.getClass().isArray()) {
s = JSONArray.fromObject(o).toString();
} else {
s = JSONObject.fromObject(o).toString();
}
return s;
}
}
5.2.5 照片接口示例5:获取照片BLOB
依赖jar包
commons-beanutils-1.8.3.jar
commons-collections-3.1.jar
commons-lang-2.5.jar
commons-logging-1.1.2.jar
ezmorph-1.0.3.jar
httpclient-4.1.2.jar
httpclient-cache-4.1.2.jar
httpmime-4.1.2.jar
httpcore-4.2.2.jar
json-lib-2.1.jar
commons-io-2.0.1.jar
客户端调用
创建客户端调用测试类Test.java,在Test.java的main方法里面进行调用代码测试:
代码如下(说明:上述代码中,在开发时请将服务地址url、appId和accessToken信息按实际情况填写,参数替换为实际的情况):
import java.io.BufferedReader;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import sun.misc.BASE64Decoder;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
public class Test4_1 {
// api请求地址url
private static final String targetURL = "http://172.16.7.124:8080/mdm_mdb_service_web-restful-hrAPI-getPhotoById/ProxyService/mdb_service_web-restful-hrAPI-getPhotoByIdProxyService";
public static void main(String[] args) {
try {
// api请求地址url
URL targetUrl = new URL(targetURL);
// 打开连接
HttpURLConnection httpConnection = (HttpURLConnection) targetUrl.openConnection();
// 参数设置
httpConnection.setDoOutput(true);
httpConnection.setRequestMethod("POST");
httpConnection.setRequestProperty("Content-Type","application/json");
// appId accessToken Header头文件信息传入
//httpConnection.setRequestProperty("serviceId", "cb265d6abcd9");
httpConnection.setRequestProperty("appId", "amp");
httpConnection.setRequestProperty("accessToken","9FB95D66318F36BB00D840E107284CDF");
// 业务参数
PhotoRequest photoRequest = new PhotoRequest();
String []ids = {"ljwan"};
photoRequest.setIds(ids);
photoRequest.setResultType(2);//1获取照片地址 2获取照片blob
photoRequest.setSizeType(3);//1小标准照 2大标准照 3生活照
OutputStream outputStream = httpConnection.getOutputStream();
outputStream.write(JsonUtils.toJson(photoRequest).getBytes("UTF-8"));
outputStream.flush();
if (httpConnection.getResponseCode() != 200) {
throw new RuntimeException("Failed : HTTP error code : "
+ httpConnection.getResponseCode());
}
// 取得输入流,并使用Reader读取调用结果
BufferedReader responseBuffer = new BufferedReader(
new InputStreamReader((httpConnection.getInputStream())));
String output;
while ((output = responseBuffer.readLine()) != null) {
output = new String(output.getBytes(), "UTF-8");
break;
}
httpConnection.disconnect();
//解析获取照片url
System.out.println("Output from Server:"+output);
JSONObject jb = JSONObject.fromObject(output);
JSONArray ja = JSONArray.fromObject(jb.get("photos"));
for(int i=0;i<ja.size();i++){
System.out.println("获取照片流base64:"+JSONObject.fromObject(ja.get(i)).get("zp").toString());
BASE64Decoder decoder = new BASE64Decoder();
//Base64解码
byte[] b = decoder.decodeBuffer(JSONObject.fromObject(ja.get(i)).get("zp").toString());
for(int l=0;l<b.length;++l)
{
if(b[l]<0)
{//调整异常数据
b[l]+=256;
}
}
//生成jpeg图片
//存为文件
String imgFilePath = "d:/test"+i+".jpg";//新生成的图片
OutputStream out = new FileOutputStream(imgFilePath);
//将字节写入文件
out.write(b);
out.flush();
out.close();
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
以上调用方法中用到四个依赖类,分别为:PhotoRequest、JsonUtils、BaseRequest、Page,代码分别见附录。执行以上调用我们可以得到以下结果:
附录
Page
public class Page {
private int pageSize;
private int pageNum;
private String order;
private String orderBy;
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public int getPageNum() {
return pageNum;
}
public void setPageNum(int pageNum) {
this.pageNum = pageNum;
}
public String getOrder() {
return order;
}
public void setOrder(String order) {
this.order = order;
}
public String getOrderBy() {
return orderBy;
}
public void setOrderBy(String orderBy) {
this.orderBy = orderBy;
}
}
BaseRequest
public class BaseRequest {
private Page page;
public Page getPage() {
return page;
}
public void setPage(Page page) {
this.page = page;
}
}
PhotoRequest
public class PhotoRequest extends BaseRequest {
private String []ids;
private int sizeType;
private int resultType;
public String[] getIds() {
return ids;
}
public void setIds(String[] ids) {
this.ids = ids;
}
public int getSizeType() {
return sizeType;
}
public void setSizeType(int sizeType) {
this.sizeType = sizeType;
}
public int getResultType() {
return resultType;
}
public void setResultType(int resultType) {
this.resultType = resultType;
}
}
JsonUtils
import java.util.Collection;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
public class JsonUtils {
private JsonUtils() {
super();
}
public static <T> String toJson(T o) {
String s = "";
if (o == null) {
return s;
}
if (o instanceof Collection || o.getClass().isArray()) {
s = JSONArray.fromObject(o).toString();
} else {
s = JSONObject.fromObject(o).toString();
}
return s;
}
}