HttpRequest POST到RESTful Web服务 - Salesforce Apex Callout

时间:2014-08-18 05:59:07

标签: c# .net wcf rest salesforce

我创建了一个RESTful Web服务(C#,WCF),它实现了以下接口:

public interface ITestService
{
    [OperationContract]
    [WebInvoke(Method = "POST",
     ResponseFormat = WebMessageFormat.Json,
     BodyStyle = WebMessageBodyStyle.Bare,
     UriTemplate = "?s={aStr}")]
    string Test(string aStr);
}

其中Test()方法只返回它给出的任何内容(或默认的"test"字符串) - 以及调用方法时的时间戳

该服务公开,所以当我在任何浏览器中输入网址时:

http://xx.xxx.xxx.xx:41000/TestService/web/

它返回json "test"字符串(或者最后可能用?s=...输入的任何字符串)。


我希望Salesforce将数据发布到此网络服务。

我的apex类看起来如此 - 当一个Object插入Salesforce时会触发它:

public class WebServiceCallout 
{
    @future (callout=true)
    public static void sendNotification(String name) 
    {
        HttpRequest req = new HttpRequest();
        HttpResponse res = new HttpResponse();
        Http http = new Http();

        req.setEndpoint('http://xx.xxx.xxx.xx:41000/TestService/web/');
        req.setMethod('POST');
        req.setHeader('Content-Type', 'application/json');
        req.setBody('');

        try 
        {
            res = http.send(req);
        } 
        catch(System.CalloutException e) 
        {
            System.debug('Callout error: '+ e);
            System.debug(res.toString());
        }
    }
}

将对象插入Salesforce时, Apex作业部分表示sendNotification()方法已完成。但该服务从未通过该方法获取POST。 (注意:已添加远程站点设置中的服务IP)。

我的语法有问题吗?

(在这个阶段,我想要的是让Salesforce调用Web服务 - 甚至不发布任何内容)


作为一个例子,我创建了一个样本Console Application,可以很好地POST到服务中。

internal static void Main(string[] args)
{
    Uri address = new Uri("http://xx.xxx.xxx.xx:41000/TestService/web/");

    // Create the web request
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(address);

    // Set type to POST
    request.Method = "POST";
    request.ContentType = "application/json";

    // Create the data we want to send  
    var postData = "";

    // Create a byte array of the data we want to send
    var byteData = UTF8Encoding.UTF8.GetBytes(postData);

    // Set the content length in the request headers
    request.ContentLength = byteData.Length;

    // Write data
    using (var stream = request.GetRequestStream())
    {
        stream.Write(byteData, 0, byteData.Length);
    }

    // Get response  
    var response = (HttpWebResponse)request.GetResponse();

    var responseString = new StreamReader(
        response.GetResponseStream()
        ).ReadToEnd();

    Console.Writeline(responseString);
}

为什么Salesforce中的Apex类没有正确标注?

1 个答案:

答案 0 :(得分:0)

我弄明白了这个问题。我没有在远程站点设置中指定端口(什么!!)

上面的代码示例应该完美无缺(至少它们对我有用)


暗示将来遇到这种情况的人

设置 - > 安全性 - > 远程网站设置

服务(远程站点URL)应该采用这种格式 - 您可以在哪里托管它:

http://xx.xxx.xxx.xx:41000

要测试上述代码,请转到:

[您的姓名] - > 开发者控制台 - > 调试 - > 打开执行匿名窗口

并复制以下行:

WebServiceCallout.sendNotification('Test');

并点击执行

代码执行,您应该看到执行日志(及其中的任何错误)。