在 Java 客户端中使用协议缓冲区同步 RESTful 请求
此示例展示如何使用 Java® 客户端 API、MATLAB® Production Server™ 用于 MATLAB 函数执行的 RESTful API 和协议缓冲区 (protobuf) 发出同步 RESTful 请求。该示例提供并解释了一个示例 Java 客户端 SyncExample.java,用于评估部署在服务器上的 MATLAB 函数。
要在向服务器发出请求时使用 protobuf,请在客户端代码中将 HTTP Content-Type 标头设置为 application/x-google-protobuf。Java 客户端库提供帮助类,以根据 proto 格式内部创建 protobuf 消息并返回相应的字节数组。在 HTTP 请求正文中使用此字节数组。Java 客户端库提供了反序列化 protobuf 响应的方法和类。
要使用 Java 客户端库,必须在 mps_client.jar 中包含 CLASSPATH。
下表显示了在哪里可以找到示例的 mps_client.jar 文件、Javadoc 和示例代码。
mps_client.jar 的位置 |
|
| Javadoc 的位置 |
|
| 示例文件的代码位置 |
|
| |
该示例使用 java.net 包发出 HTTP 请求来评估在 http://localhost:9910 上运行的 MATLAB Production Server 实例上部署的 MATLAB 函数。
在服务器上部署您的 MATLAB 函数
编写一个使用 magic (MATLAB) 函数创建幻方的 MATLAB 函数 mymagic,然后将其部署在服务器上。
有关如何部署的信息,请参阅针对 MATLAB Production Server 创建可部署存档。
function m = mymagic(in) m = magic(in); end
函数 mymagic 接受单个 int32 输入并以二维 double 数组的形式返回一个幻方。
向服务器发出同步请求
构建请求 URL。
在 Java 客户端中,使用POST Synchronous Request向服务器发出初始请求。请求 URL 包括服务器实例的地址、部署的存档的名称和要评估的 MATLAB 函数的名称。
String mpsBaseUrl = "http://localhost:9910"; URL url; url = new URL(mpsBaseUrl + "/mymagic/mymagic");设置请求标头。
将 HTTP
Content-Type标头设置为application/x-google-protobuf,因为 API 返回协议缓冲区消息的字节数组。final static protected String CONTENT_TYPE = "application/x-google-protobuf"; HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); urlConnection.setDoOutput(true); urlConnection.setRequestProperty("Content-Type", CONTENT_TYPE);创建包含协议缓冲区消息的 HTTP 请求正文。
函数
mymagic接受单个int32输入并以二维double数组的形式返回一个幻方。使用
newInstance(arg1, arg2, arg3)类中定义的MATLABParams方法来构建消息。由于mymagic函数返回单个二维数组,因此将arg1设置为1,将arg2设置为double[][].class。为arg3指定一个整数值,它是mymagic函数的输入。MATLABParams mlMakeBody = MATLABParams.newInstance(1, double[][].class, 2);
将请求发送到服务器。
将
MATLABParamsmlMakeBody对象写入 HTTP 请求的输出流。OutputStream output = urlConnection.getOutputStream(); output.write(mlMakeBody.getRequestBody()); output.flush();
接收并解释服务器响应
成功执行 HTTP 请求后,服务器将使用协议缓冲区消息进行响应。使用 MATLABResult 类的方法解析协议缓冲区消息以获取请求的结果。要创建 MATLABResult 对象,请将 MATLABParams mlMakeBody 对象和 HTTP 请求的响应主体传递给 newInstance 方法。
如果部署的 MATLAB 函数执行时发生错误,则对 getResult 方法的调用将抛出包含来自 MATLAB 的错误消息的 MATLABException。
MATLABResult<double[][]> mlFinalResult1 =
MATLABResult.newInstance(mlMakeBody, urlConnection.getInputStream());
try{
double[][] magicSq1 = mlFinalResult1.getResult();
printResult(magicSq1);
}catch(MATLABException e){
e.printStackTrace();
}编写一个辅助方法 printResult,将从响应主体解析的结果作为输入并打印相应的二维数组。
private static void printResult(double[][] result) {
for (double[] row : result) {
for (double element : row) {
System.out.print(element + " ");
}
System.out.println();
}
}SyncExample.java Java 客户端的示例代码如下。
代码:
