在 MobileFirst 平台中放置 HTTP 适配器
PUT HTTP Adapter in MobileFirst Platform
我正在尝试 post 来自我的本机 android 应用程序的一些数据。
本地代码:
WLProcedureInvocationData invocationData = new WLProcedureInvocationData("TaskAdapter", "updateTask");
int taskId = Integer.parseInt(tvTaskId.getText().toString());
String assignedTo = tvAssignedTo.getText().toString();
String address = "";
String description = "";
String latitude = "5.0";
String longitude = "5.0";
String status = "5.0";
String comments = "5.0";
String lastupdate = "5.0";
String userLatitude = "5.0";
String userLongitude = "5.0";
String userLocation = "5.0";
String photoData = "5.0";
Object[] parameters = new Object[]{
taskId,
assignedTo,
description,
address,
latitude,
longitude,
status,
comments,
lastupdate,
userLatitude,
userLongitude,
userLocation,
photoData
};
invocationData.setParameters(parameters);
WLRequestOptions options = new WLRequestOptions();
options.setTimeout(30000);
client.getInstance().invokeProcedure(invocationData, new MyInvokeListener(), options);
适配器代码:
function updateTask(id) {
var input = {
method : 'PUT',
returnedContentType : 'json',
path : '/Api/Task?taskid=' + id
};
return WL.Server.invokeHttp(input);
}
适配器XML:
<?xml version="1.0" encoding="UTF-8"?>
<!--
Licensed Materials - Property of IBM
5725-I43 (C) Copyright IBM Corp. 2011, 2013. All Rights Reserved.
US Government Users Restricted Rights - Use, duplication or
disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
-->
<wl:adapter name="TaskAdapter" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:wl="http://www.ibm.com/mfp/integration" xmlns:http="http://www.ibm.com/mfp/integration/http">
<displayName>TaskAdapter</displayName>
<description>TaskAdapter</description>
<connectivity>
<connectionPolicy xsi:type="http:HTTPConnectionPolicyType">
<protocol>http</protocol>
<domain>testmeternative.vdot.virginia.gov</domain>
<port>80</port>
<connectionTimeoutInMilliseconds>30000</connectionTimeoutInMilliseconds>
<socketTimeoutInMilliseconds>30000</socketTimeoutInMilliseconds>
<maxConcurrentConnectionsPerNode>50</maxConcurrentConnectionsPerNode>
<!-- Following properties used by adapter's key manager for choosing specific
certificate from key store <sslCertificateAlias></sslCertificateAlias> <sslCertificatePassword></sslCertificatePassword> -->
</connectionPolicy>
</connectivity>
<procedure name="getAllTasks" />
<procedure name="updateTask" />
</wl:adapter>
我不确定我是否以正确的方式发送正文。此外,如何将 id
(参数)发送到适配器函数。
当我在 eclipse 中单击 Call Mobile First Adapter 时,它向我显示过程名称,但下拉列表中的 REST 调用类型为 GET
,我想要它作为 PUT
.
您需要按如下方式更新您的适配器代码:
function updateTask(id, assignedTo, description, address, latitude, longitude,
status, comments, lastupdate, userLatitude, userLongitude,
userLocation, photoData) {
var data = {
"assignedTo" : assignedTo,
"description" : description,
"address" : address,
"latitude" : latitude,
"longitude" : longitude,
"status" : status,
"comments" : comments,
"lastupdate" : lastupdate,
"userLatitude" : userLongitude,
"userLocation" : userLocation,
"photoData" : photoData
};
var input = {
method : 'PUT',
returnedContentType : 'json',
path : '/Api/Task?taskid=' + id,
body : {
contentType : 'application/json',
content : data
}
};
return WL.Server.invokeHttp(input);
}
由于您在本机代码中通过 invocationData.setParameters(parameters);
将值传递给适配器,这意味着适配器将以相同的顺序采用相同数量的参数。
我创建了一个对象 data
,它将包含除 id
或 taskId
之外的所有这些值,因为您将其作为查询参数传递。那么我假设您的后端服务接受 application/json
的 Content-Type
,您可以根据需要更改内容类型。
确保区分应用调用适配器的方式和适配器调用后端的方式 - 这些是不同的概念。
在 MFP/Worklight 的早期版本中,适配器是使用 HTTP GET 调用的;适配器本身可能随后使用 GET、PUT 或 POST 调用了后端,但应用程序实际上是通过 HTTP 进行 RPC 调用。
在 MFP 7.0 版中,我们获得了创建 RESTful 适配器的能力,可以使用 GET、PUT、POST 或 DELETE 调用它。这些适配器在 Java 中使用 JAX/RS 编程模型实现。每个单独的程序都将被标记为使用其中一个 HTTP "verbs",然后当您在 Eclipse 中测试时 select 将提供适当的 GET/PUT/POST 程序。在您的示例中,您有一个简单的传统 JavaScript 适配器,因此只能使用 GET,这就是测试工具提供的。
要调用 Java RESTful 适配器,您需要指定动词。 See this tutorial:
查看如何创建 Java RESTful 适配器 see this tutorial
我正在尝试 post 来自我的本机 android 应用程序的一些数据。
本地代码:
WLProcedureInvocationData invocationData = new WLProcedureInvocationData("TaskAdapter", "updateTask");
int taskId = Integer.parseInt(tvTaskId.getText().toString());
String assignedTo = tvAssignedTo.getText().toString();
String address = "";
String description = "";
String latitude = "5.0";
String longitude = "5.0";
String status = "5.0";
String comments = "5.0";
String lastupdate = "5.0";
String userLatitude = "5.0";
String userLongitude = "5.0";
String userLocation = "5.0";
String photoData = "5.0";
Object[] parameters = new Object[]{
taskId,
assignedTo,
description,
address,
latitude,
longitude,
status,
comments,
lastupdate,
userLatitude,
userLongitude,
userLocation,
photoData
};
invocationData.setParameters(parameters);
WLRequestOptions options = new WLRequestOptions();
options.setTimeout(30000);
client.getInstance().invokeProcedure(invocationData, new MyInvokeListener(), options);
适配器代码:
function updateTask(id) {
var input = {
method : 'PUT',
returnedContentType : 'json',
path : '/Api/Task?taskid=' + id
};
return WL.Server.invokeHttp(input);
}
适配器XML:
<?xml version="1.0" encoding="UTF-8"?>
<!--
Licensed Materials - Property of IBM
5725-I43 (C) Copyright IBM Corp. 2011, 2013. All Rights Reserved.
US Government Users Restricted Rights - Use, duplication or
disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
-->
<wl:adapter name="TaskAdapter" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:wl="http://www.ibm.com/mfp/integration" xmlns:http="http://www.ibm.com/mfp/integration/http">
<displayName>TaskAdapter</displayName>
<description>TaskAdapter</description>
<connectivity>
<connectionPolicy xsi:type="http:HTTPConnectionPolicyType">
<protocol>http</protocol>
<domain>testmeternative.vdot.virginia.gov</domain>
<port>80</port>
<connectionTimeoutInMilliseconds>30000</connectionTimeoutInMilliseconds>
<socketTimeoutInMilliseconds>30000</socketTimeoutInMilliseconds>
<maxConcurrentConnectionsPerNode>50</maxConcurrentConnectionsPerNode>
<!-- Following properties used by adapter's key manager for choosing specific
certificate from key store <sslCertificateAlias></sslCertificateAlias> <sslCertificatePassword></sslCertificatePassword> -->
</connectionPolicy>
</connectivity>
<procedure name="getAllTasks" />
<procedure name="updateTask" />
</wl:adapter>
我不确定我是否以正确的方式发送正文。此外,如何将 id
(参数)发送到适配器函数。
当我在 eclipse 中单击 Call Mobile First Adapter 时,它向我显示过程名称,但下拉列表中的 REST 调用类型为 GET
,我想要它作为 PUT
.
您需要按如下方式更新您的适配器代码:
function updateTask(id, assignedTo, description, address, latitude, longitude,
status, comments, lastupdate, userLatitude, userLongitude,
userLocation, photoData) {
var data = {
"assignedTo" : assignedTo,
"description" : description,
"address" : address,
"latitude" : latitude,
"longitude" : longitude,
"status" : status,
"comments" : comments,
"lastupdate" : lastupdate,
"userLatitude" : userLongitude,
"userLocation" : userLocation,
"photoData" : photoData
};
var input = {
method : 'PUT',
returnedContentType : 'json',
path : '/Api/Task?taskid=' + id,
body : {
contentType : 'application/json',
content : data
}
};
return WL.Server.invokeHttp(input);
}
由于您在本机代码中通过 invocationData.setParameters(parameters);
将值传递给适配器,这意味着适配器将以相同的顺序采用相同数量的参数。
我创建了一个对象 data
,它将包含除 id
或 taskId
之外的所有这些值,因为您将其作为查询参数传递。那么我假设您的后端服务接受 application/json
的 Content-Type
,您可以根据需要更改内容类型。
确保区分应用调用适配器的方式和适配器调用后端的方式 - 这些是不同的概念。
在 MFP/Worklight 的早期版本中,适配器是使用 HTTP GET 调用的;适配器本身可能随后使用 GET、PUT 或 POST 调用了后端,但应用程序实际上是通过 HTTP 进行 RPC 调用。
在 MFP 7.0 版中,我们获得了创建 RESTful 适配器的能力,可以使用 GET、PUT、POST 或 DELETE 调用它。这些适配器在 Java 中使用 JAX/RS 编程模型实现。每个单独的程序都将被标记为使用其中一个 HTTP "verbs",然后当您在 Eclipse 中测试时 select 将提供适当的 GET/PUT/POST 程序。在您的示例中,您有一个简单的传统 JavaScript 适配器,因此只能使用 GET,这就是测试工具提供的。
要调用 Java RESTful 适配器,您需要指定动词。 See this tutorial:
查看如何创建 Java RESTful 适配器 see this tutorial