从 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 适配器

Worklight HTTP 适配器不适用于 Kerberos

Worklight HTTP 适配器与 Ajax 请求

IBM Worklight - 从客户端发送 HTTP POST 请求