1

我编写了一个通过 REST API 与 Salesforce 交互的 Wordpress 插件。它使用用户名/密码成功获取实例 URL 和身份验证令牌。

我可以分别使用 wp_remote_post 和 GET 和 POST 提交查询和创建对象。

然而,在创建对象时,虽然在 Salesforce 实例中成功创建,但我得到以下响应我的 POST:

{"message":"HTTP 方法 'POST' 不允许。允许的是 HEAD,GET,PATCH,DELETE","errorCode":"METHOD_NOT_ALLOWED"}

使用来自这些请求的相同 json 正文内容,我可以毫无问题地通过 Salesforce Workbench 提交和创建。我得到一个如下所示的正确响应:

{“id”:“003E000000OubjkIAB”,“成功”:真,“错误”:[]}

我发送的标头中是否有 Salesforce 仅部分不同意的内容?以下是使用 wp_remote_post 发送的其他一些参数 - http://codex.wordpress.org/HTTP_API#Other_Arguments

这是调用它的php代码:

$connInfo['access_token'] = get_transient('npsf_access_token');
$connInfo['instance_url'] = get_transient('npsf_instance_url');
$url = $connInfo['instance_url'] . $service;

$sfResponse = wp_remote_post($url, array(
        'method' => $method,
        'timeout' => 5,
        'redirection' => 5,
        'httpversion' => 1.0,
        'blocking' => true,
        'headers' => array("Authorization" => "OAuth ". $connInfo['access_token'], "Content-type" => "application/json"),
        'body' => $content,
        'cookies' => array()
        )
    );

$content 在到达这一点之前正在通过 json_encode 进行编码。

更新: 它特定于 WP_Http_Curl 类发送的额外 CURL 选项之一。我还没有确定哪一个 Salesforce 存在问题。

4

1 回答 1

1

解决方案是在请求中禁用重定向。您将其设置为 5(默认值)——它需要设置为 0 才能正常工作。

初始请求有效,但 Salesforce 会发送一个location标头作为响应的一部分(新创建对象的 URL)。WordPress 认为它​​被告知该 URL 已移动,并且应在此新 URL 上重试。您看到的响应是对您刚刚创建的实际对象的第二次请求的结果。该 URL 显然不接受POST请求。

Salesforce 发送这样的标头有点奇怪,但在 WordPress 方面也有一些讨论,即 WordPress 不应该遵循可以解决此问题location的非301/响应的标头。302

感谢您顺便发布这个。你的更新让我开始调试WP_Http_Curl,这让我意识到它实际上是在发出第二个 HTTP 请求。

于 2013-02-16T02:16:43.710 回答