我创建了一个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类没有正确标注?
答案 0 :(得分:0)
我弄明白了这个问题。我没有在远程站点设置中指定端口(什么!!)
上面的代码示例应该完美无缺(至少它们对我有用)
暗示将来遇到这种情况的人:
在设置 - > 安全性 - > 远程网站设置
服务(远程站点URL)应该采用这种格式 - 您可以在哪里托管它:
http://xx.xxx.xxx.xx:41000
要测试上述代码,请转到:
[您的姓名] - > 开发者控制台 - > 调试 - > 打开执行匿名窗口
并复制以下行:
WebServiceCallout.sendNotification('Test');
并点击执行。
代码执行,您应该看到执行日志(及其中的任何错误)。