从 Worklight 获取 HTTP 适配器的响应
Posted
技术标签:
【中文标题】从 Worklight 获取 HTTP 适配器的响应【英文标题】:Getting response from HTTP Adapter from Worklight 【发布时间】:2014-02-10 12:30:32 【问题描述】:我是工作灯的新手。我试图从 http 适配器获取 json 响应, 但我无法让它在设备上显示。 我在我的 javascript 代码中添加了一些警报,发现它返回 json 对象的大小为“未定义”。
这是我的适配器 javascript 文件:
function getGooglePlaces(location,name)
var input =
method : 'get',
returnedContentType : 'json',
path : 'maps/api/place/search/json',
headers:
Host: 'maps.googleapis.com'
,
parameters :
'key' : MyKey,
'location' : location,
'radius' : '10000',
'sensor' : 'false',
'name' : name
;
var response = WL.Server.invokeHttp(input);
return response;
function addGooglePlace(param1)
var input =
method : 'put',
returnedContentType : 'json',
path : 'userInputRequired'
;
return WL.Server.invokeHttp(input);
我的 main.js 文件:
function getLocation()
if (navigator.geolocation)
navigator.geolocation.getCurrentPosition(loadHTTPRecords);
elsex.innerhtml="Geolocation is not supported by this browser.";
function loadHTTPRecords(position)
var invocationData =
adapter : 'GooglePlaces',
procedure : 'getGooglePlaces',
parameters : [position.coords.latitude+','+position.coords.longitude,'dead battery']
;
WL.Client.invokeProcedure(invocationData,
onSuccess : loadHTTPQuerySuccess,
onFailure : loadHTTPQueryFailure
);
function loadHTTPQuerySuccess(result)
WL.Logger.debug("Retrieve success" + JSON.stringify(result));
displayFeeds(result);
function loadHTTPQueryFailure(result)
WL.Logger.error("Retrieve failure");
function displayFeeds(items)
alert("In displayFeeds");
// Get the size of an object
var ul = $('#itemsList');
alert("before for loop");
alert(items.size);
for (var i = 0; i < items.size; i++)
alert("inside for loop 1");
for(var j=0;j<i;j++)
alert("in for loop 2");
var li = $('<li/>').html(items[i].name);
li.append($('<hr>'));
ul.append(li);
请指出我做错了什么。
我的示例 json 响应
"html_attributions": [
],
"isSuccessful": true,
"responseHeaders":
"Alternate-Protocol": "443:quic",
"Cache-Control": "public, max-age=300",
"Content-Type": "application\/json; charset=UTF-8",
"Date": "Tue, 11 Feb 2014 12:04:13 GMT",
"Expires": "Tue, 11 Feb 2014 12:09:13 GMT",
"Server": "mafe",
"Transfer-Encoding": "chunked",
"Vary": "Accept-Language",
"X-Frame-Options": "SAMEORIGIN",
"X-XSS-Protection": "1; mode=block"
,
"responseTime": 236,
"results": [
"geometry":
"location":
"lat": 52.057049,
"lng": 1.153298
,
"icon": "http:\/\/maps.gstatic.com\/mapfiles\/place_api\/icons\/cafe-71.png",
"id": "ec0955fb06fd95d639c89d12475624627250abac",
"name": "Costa Coffee",
"opening_hours":
"open_now": true
,
"price_level": 2,
"rating": 3.9,
"reference": "CnRuAAAABmdY6kIxRQZw68hqjZ_wwBE29sdSgYuOkXf2IvZTe77aG-AgoCaahu1c9cddHA0Z1D2EdELAEuDyl38xV1G5YcvP3pOm2p0IwVkuvYIJSA1IKAGLIQym21SpXvhUSqBxrpHKBvgTNnUg69lHROaMyxIQvvP8SeCG_dzKi_JgrdrgRRoUQXqH4UkDtA-58bCbdRzUCdXTRVU",
"types": [
"cafe",
"food",
"establishment"
],
"vicinity": "1-5 Queen St, Ipswich"
,
【问题讨论】:
在使用 Invoke Worklight Procedure 调用适配器过程时是否得到响应 是的,我在调用过程时得到了响应,但问题是当我尝试访问数组结果时,它显示“未定义” 您能否在您的问题中提供示例结果,因为我认为您以错误的方式遍历 json。 【参考方案1】:如果我正确理解您的问题,您可以通过 items.size 获得结果的长度。如果您想获得结果的长度,您应该使用items.invocationResult.results.length
,它将为您提供结果总数,其中项目是来自适配器的响应,invocationResult
包含结果和其他参数,您将拥有访问结果以仅访问特定输出。
如果我没有正确理解你的问题,请告诉我你想通过 items.size 得到什么
【讨论】:
我有一个问题,我应该使用 JSON.stringify 将 json 对象转换为字符串,然后使用 items.invocationResult.results 是的,您可以使用。两者都会给你相同的结果,但是如果你想访问结果长度,你可以直接使用 item.invocationResult.results。 谢谢 sasi,我明白了,还有一个疑问。在同一个响应中,我想访问每个结果的 price_level,但是当我运行它时,它显示未定义 如果您注意到您的响应,结果是数组格式,因此如果您想访问 price_level,您可以提及您正在访问的数组索引,例如对于此输出,您可以访问比如 items.invocationResult.results[0].price_level 我试过了并写了一个 console.log 来查看它打印的内容,我得到了 price_level 的“未定义”以上是关于从 Worklight 获取 HTTP 适配器的响应的主要内容,如果未能解决你的问题,请参考以下文章
无法从 Worklight Liberty 服务器中的 HTTP 适配器调用 java 类
如何将域、端口号、用户名和密码从用户输入传递到 Worklight http 适配器
从非 Worklight 应用程序调用 Worklight 适配器