POST适配器HTTP Worklight 6 500服务器错误

时间:2014-07-30 15:04:54

标签: json rest ibm-mobilefirst worklight-adapters

我正在尝试在Hybrid Worklight应用程序中注册用户。为此我使用外部REST API。 API说:

  
      
  • 请求方法:POST
  •   
  • 请求网址:https:// $ {domainservice} / service / plan / $ {planName} / user?key = $ {key}& tenantId = $ {tenantId}
  •   
  • 请求标题:Content-Type:application / json
  •   
  • 请求有效负载:

         

    {       “uid”:“patricia”,       “firstName”:“Patricia”,       “lastName”:“Mayo”,       “pic”:“BASE64_ENCODED_IMAGE”   }

  •   
     

字段说明:

     
      
  • uid(必填):用户的uid
  •   
  • firstName(可选):用户的名字
  •   
  • lastName(可选):用户的姓氏
  •   
  • pic(可选):用户的图片编码为base64 string
  •   

所以我创建了一个HTTP Worklight适配器:

function RegisterUser(userid) {
    var input = {
        method : 'post',
        path : '/service/plan/App/user',
        returnedContentType : 'plain',
        headers: {'Content-Type' : 'application/json'},         
        parameters: { 
                'key':'e634bc60-0c6eba577258',
                'tenantId': 'd93b921d-a56c-a645924fd548'                    
        },
        body : {
                'contentType' : 'application/json',
                'content' : JSON.stringify({
                    "uid" : userid})    
        }
    };

    return WL.Server.invokeHttp(input);
}

我收到了这个错误:

   { "errors": [
   ],
   "info": [
   ],
   "isSuccessful": true,
   "responseHeaders": {
      "$wsep": "",
      "Connection": "Keep-Alive",
      "Content-Language": "en-US",
      "Content-Type": "text\/html;charset=ISO-8859-1",
      "Date": "Wed, 30 Jul 2014 14:47:27 GMT",
      "Transfer-Encoding": "chunked",
      "X-Backside-Transport": "FAIL FAIL",
      "X-Client-IP": "199.127.32.67",
      "X-Global-Transaction-ID": "48515650",
      "X-Powered-By": "Servlet\/3.0"
   },
   "responseTime": 357,
   "statusCode": 500,
   "statusReason": "Internal Server Error",

我觉得设置

非常奇怪
  

标题:{'Content-Type':'application / json'}

但在回复中看起来像是

  

“Content-Type”:“text / html; charset = ISO-8859-1”

此外,我想指出一些我已经尝试过的事情:

  • returnedContentType:'plain' - >它被设置为plain,因为如果我将它设置为json我会得到一个JSON解析错误

  • 身体内容我也试过

    var payload = "{\'uid\': \'"+userid+"\'}";  
    payload = payload.toString();
    

    然后'content' : payload

  • 使用浏览器的RESTClient一切正常

  • 我尝试使用http端口80,http端口2080,以及https 443

  • 我也尝试在标题中写入主机

3 个答案:

答案 0 :(得分:0)

在服务器遇到错误情况的情况下,我不会太担心有效负载的格式 - 理想情况下,服务器会给我们很好的错误响应,但这并不总是可行的。通常情况下,如果成功的情况下预期的响应类型是JSON,那么这就是我指定的内容,而且我只需要对JSON解析失败时的情况进行足够的错误处理。

至于为什么你得到500错误...我可以建议最好使用某种网络监视器来辨别通过Worklight发出的请求和浏览器的REST客户端发出的请求之间的区别。

您可以在Eclipse,Preferences-> Run-> TCP / IP Monitor ...

中进行设置。

答案 1 :(得分:0)

您可能想要添加主机标头。我曾多次见过解决类似问题的地方。例如。如果您尝试连接到http://www.server.com/a/b/c/d,请将以下标题添加到标题属性

headers: {
    Host: 'www.server.com'
}

答案 2 :(得分:0)

我终于找到了错误。 Worklight中存在缺陷,查询参数被删除并放入请求主体中,因此REST服务不会收到密钥和密钥。 tenantId。这是最终的工作代码解决方案。无论如何,谢谢您的快速回答:)

function RegisterUser(userid) {
    var payload = '{"uid": \"'+userid+'\"}';  
    var input = {
        method : 'post',
        path : '/service/plan/App/user?key=e630-db87-4803-bc45-57725c&tenantId=d9348af-a56c-a645924fd54e',
        returnedContentType : 'application/json',
        headers: {'Content-Type' : 'application/json'},         
        body : {
                    'contentType' : 'application/json',
                    'content' : payload.toString()
        }
    };

    return WL.Server.invokeHttp(input);
}