【发布时间】: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,但该集合似乎抱怨上面的错误。