在 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);
将请求发送到服务器。
将
MATLABParams
mlMakeBody
对象写入 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 客户端的示例代码如下。
代码: