【问题标题】:IBM MobileFirst Foundation 8.0 POST resource request in javascript is not workingjavascript 中的 IBM MobileFirst Foundation 8.0 POST 资源请求不起作用
【发布时间】:2016-10-14 10:58:41
【问题描述】:

我在 MobileFirst Foundation 8.0 中遇到问题,其中 POST 请求中的参数未在适配器中捕获,但在 GET 请求中该参数工作正常。

GET 请求示例

var url = "/adapters/samplePOST/unprotected/";
var resourceRequest = new WLResourceRequest(url, WLResourceRequest.GET);
resourceRequest.setQueryParameter("params","['value1','value2']");
resourceRequest.send().then(function(e){console.log(e)}, function(e){console.log(e)});

适配器端

function unprotected(user){
    return {
        result:JSON.stringify(user)
    };
}

输出

{\"结果\":\"\"sd\"\",\"isSuccessful\":true}

POST 请求示例

客户端

var url = "/adapters/samplePOST/unprotected/";
var resourceRequest = new WLResourceRequest(url, WLResourceRequest.POST);
var data={"params": "['sd','ds']"};
resourceRequest.sendFormParameters(data);
resourceRequest.send().then(function(e){console.log(e)}, function(e){console.log(e)});

适配器端

function unprotected(user){
    return {
        result:JSON.stringify(user)
    };
}

输出

{\"isSuccessful\":true}

在POST请求适配器端,参数为undefined

另外,在我的开发控制台中 -> 大摇大摆地,如果我点击 POST 请求表单查询 [{"params": "['sd','ds']"}] 它工作正常,但从科尔多瓦应用程序无法解析参数,但在同一个科尔多瓦应用程序 GET 请求工作正常。

【问题讨论】:

  • 如果您在 POST 调用中尝试查询参数会怎样?这工作正常吗?
  • .setQueryParameter 用于 GET 请求。使用 POST 会给出“不支持的媒体类型”。我相信@deena117 可能在这里偶然发现了一个缺陷......
  • 您发送了两次请求。一次使用表单正文,一次没有正文。

标签: javascript post ibm-mobilefirst mobilefirst-adapters


【解决方案1】:

更新:请注意,您应该将提出请求的方式更改为以下内容:

resourceRequest.sendFormParameters(data).then(
    function(e) {
        console.log(e)
    },
    function(e){
        console.log(e)
    }
 );

sendFormParameters实际上是发送请求,所以不需要同时使用send。否则,您将发送参数 - 两次,这会触发此问题。


我自己试过了,很奇怪。
在 Swagger 中,我确实得到了以下作为 POST 请求的响应正文,正如您所展示的:

{
  "result": "\"value1\"",
  "isSuccessful": true
}

但在应用程序中,响应对象中缺少 result 属性。

使用MFP.Logger.info 在适配器中打印param 值我可以在应用程序服务器的 messages.log 文件中看到以下 两个 记录器行,即使我只有一个单个记录器行:

[10/9/16 10:57:00:643 IDT] 00000ec7 MFP.Logger I ********** 参数值为:sd
[10/9/16 10:57:00:646 IDT] 00000f3e MFP.Logger I ********** 参数值为:未定义

一个有值,另一个没有......我想未定义的返回给客户端,这就是为什么你没有得到结果值(?)。

【讨论】:

  • 你有 Angular 的工作示例吗?就是无法让它工作。
  • @Idan Adar 是否可以使用 Javascript 适配器将日志写入服务器中的文件
【解决方案2】:

问题是您误用了 sendFormParameters() API。 正确使用(异步承诺)JavaScript API。 在您的示例中使用 sendFormParamters() 或 send() 但不能同时使用 API。这两个功能是实现同一目标的不同方式。

例如:

var resourceRequest = new WLResourceRequest(url, WLResourceRequest.POST);
var data={"params": "['value1', 'value2']"};
var result = resourceRequest.sendFormParameters(data).then(
                function(response){
                    alert ("responseText: " + response.responseText + " ** responseJSON: " + JSON.stringify(response.responseJSON));
                },
                function(err){
                    alert (JSON.stringify(err));
                }
);

后来的 API 似乎没有问题。

正在为 send() API 打开 PMR。 当使用带有 POST 和空正文的 MFP v8.0 资源请求时:内容类型必须设置为 application/x-www-form-urlencoded 如果与 send() API 结合使用。 Android 代码将失败(iOS 工作正常)。 简单的解决方法:在编写 WLResourceRequest 时,手动添加一个 HTTP“Content-Type”标头,如下所示:

var resourceRequest = new WLResourceRequest(url, WLResourceRequest.POST);
    resourceRequest.setQueryParameter("params", "['value1', 'value2']");
    resourceRequest.setHeader('Content-Type','application/x-www-form-urlencoded');
    resourceRequest.send().then....more code here...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多