【问题标题】:Change HTTP URL in Worklight adapter在 Worklight 适配器中更改 HTTP URL
【发布时间】:2013-03-04 04:18:29
【问题描述】:

我需要为 worklight 创建一个 HTTP 适配器,但 url 必须通过参数以编程方式提供。

1) 我能够传递用户/密码,但不能传递 url。有没有办法做到这一点?

我还尝试创建自己的 java 适配器来调用 REST API,它在我测试适配器时工作,但似乎我的响应不是工作灯的预期格式。我收到了这个错误:

2) BAD_PARAMETER_EXPECTED_DOCUMENT_OR_ARRAY_OF_DOCUMENT。

我的 Java 适配器返回一个 JSONArtifact (JSONObject),但似乎 Worklight 希望将其嵌入到另一个 JSONObject 中,例如 {"array":{...}}。 有没有办法将 JSONObject 转换为 worklight 预期的格式。

导入 org.apache.wink.json4j.JSON; 导入 org.apache.wink.json4j.JSONArtifact; 导入 org.apache.wink.json4j.JSONException; private Header headerUserAgent = new Header("User-Agent", "Mozilla"); private Header headerAccept = new Header("Accept", "application/json"); 私有字符串主机名; 私有字符串 baseURL; 受保护的MyHttpClient(字符串用户名,字符串用户密码,字符串主机名,字符串baseURL){ 极好的(); 凭据 defaultcreds = new UsernamePasswordCredentials(userName, 用户密码); this.getState().setCredentials(AuthScope.ANY, defaultcreds); this.hostName = 主机名; this.baseURL = baseURL; } 私有 GetMethod getGetMethod(String url) 抛出 URIException { GetMethod httpMethod = new GetMethod(new HttpsURL("https://"+hostName+baseURL+url).getEscapedURI()); addCommonHeaders(httpMethod); 返回http方法; } 私有 JSONArtifact getResponseAsJSONObject(InputStream inputStream) 抛出 IOException { InputStreamReader reader = new InputStreamReader(inputStream); 尝试 { JSONArtifact json = JSON.parse(reader); 返回 json; } 捕捉(NullPointerException e){ // TODO 自动生成的 catch 块 e.printStackTrace(); } 捕捉(JSONException e){ // TODO 自动生成的 catch 块 e.printStackTrace(); } 返回空值; }

适配器:

函数getResponse(用户,密码){ var client = new com.itdove.mypackage.MyHttpClient(user,password,"myurl","mybaseurl"); 返回 { 数组:client.executeGet("mypath") }; }

它适用于此,但此解决方案不提供服务 url 作为参数:

函数getResponseAdapters(路径,用户名,密码){ 变量输入 = { 方法:'get', 返回内容类型:'json', 标题:{ '用户代理':'Mozilla', '授权': '基本'+Base64.encode(用户名+':'+密码), } , 路径:“/资源/”+路径 }; 返回 WL.Server.invokeHttp(输入); } 函数getResponse(用户名,密码){ 返回 getMySCAWSAdapters(路径、用户名、密码); }

收藏

vAPPArrayAdapterOptions = { 名称:'myResponseAdapter', 代替: '', 消除: '', 添加: '', 加载: { 程序:'getResponse', 参数:[“用户”,“密码”], 键:'数组' }, 接受:功能(数据){ 返回(data.status === 200); } }, ... vAPPArray = wlJsonStore.initCollection( "vAPPArray", vAPPArraySearchFields, {适配器:vAPPArrayAdapterOptions, onSuccess: initCollectionSuccessCallback, onFailure: initCollectionFailureCallback, 加载:真});

非常感谢 多米尼克

【问题讨论】:

  • 1) 您需要创建一个适配器,然后将其“链接”到 JSONStore 集合。至少据我所知,无法通过 JavaScript 代码创建适配器。阅读适配器部分here 了解更多详情。
  • 2) 我不确定我是否理解这个问题。您是否尝试过将 JSONObject 嵌入到您提到的另一个 JSONObject 中?如果那行得通,那就是我会做的。也许您可以尝试模仿 Worklight 适配器的输出(InvocationResult、状态等键)。
  • 旁注:如果您提供了您想要实现的代码或伪代码示例,将会很有帮助。我假设你在谈论JSONStore 并标记了这个问题。
  • @cnandreu,1)这就是我所做的并修改适配器以将用户/密码作为参数传递。我想知道是否还有一种方法可以将 url 作为参数传递。 2)由于我无法传递 url,我创建了自己的 Java 适配器(上面的代码),我从我的 Java 适配器返回了一个 JSONOBject,但该集合似乎抱怨上面的错误。

标签: ibm-mobilefirst jsonstore


【解决方案1】:

找到解决方案:

首先,我使用的是 apache wink JSONArtifact 而不是 com.ibm.json.java.JSONArtifact!

其次我修改了我的收集器实现方法如下添加状态(不确定是否需要)

函数getResponse(用户,密码,主机名){ var client = new com.itdove.mypackage.IWDHttpClient(user,password,hostname,"mypath"); 返回 { 数组:client.executeGet("mymethod"), 状态码:client.getStatusCode(), statusReason:client.getStatusReason() }; }

在 myCollector.js 中,在调用我的 initCollection 之前,我将用户、密码、主机名设置如下。

参数 = [ settings.json.user, settings.json.password, settings.json.hostname ]; myAdapterOptions.load["params"] = 参数;

【讨论】:

    猜你喜欢
    • 2015-10-25
    • 2016-01-03
    • 1970-01-01
    • 2013-02-12
    • 2013-05-31
    • 1970-01-01
    • 2014-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多