我有一个呼叫REST Web服务的Apex类(
SalesForce中的一个类).
public class WebServiceCallout { @future (callout=true) public static void sendNotification(String aStr) { HttpRequest req = new HttpRequest(); HttpResponse res = new HttpResponse(); Http http = new Http(); req.setEndpoint('http://xx.xxx.xxx.xx:41000/TestService/web/test'); req.setMethod('POST'); req.setHeader('Content-Type','application/json'); req.setBody(aStr); // I want to read this in the web service try { res = http.send(req); } catch(System.CalloutException e) { System.debug('Callout error: '+ e); System.debug(res.toString()); } } }
REST Web服务(C#,WCF)如下所示:
public interface ITestService { [OperationContract] [WebInvoke(Method = "POST",ResponseFormat = Webmessageformat.Json,BodyStyle = WebMessageBodyStyle.Bare,UriTemplate = "/test")] string Test(string aStr); }
我跑的时候
WebServiceCallout.sendNotification("a test message")
POST到达Web服务但是如何读取在sendNotification()方法中设置的HttpRequest req主体中设置的内容 – req.setBody(aStr);?
也就是说,字符串Test的参数应该是什么(字符串aStr);是?
解决方法
如果要读取传入请求的原始主体,则应将参数类型定义为Stream,而不是字符串.下面的代码显示了实现场景的一种方法,而
http://blogs.msdn.com/b/carlosfigueira/archive/2008/04/17/wcf-raw-programming-model-receiving-arbitrary-data.aspx的帖子提供了有关此“原始”模式的更多信息.
public class StackOverflow_25377059 { [ServiceContract] public interface ITestService { [OperationContract] [WebInvoke(Method = "POST",UriTemplate = "/test")] string Test(Stream body); } public class Service : ITestService { public string Test(Stream body) { return new StreamReader(body).ReadToEnd(); } } class RawMapper : WebContentTypeMapper { public override WebContentFormat GetmessageformatForContentType(string contentType) { return WebContentFormat.Raw; } } public static void test() { var baseAddress = "http://" + Environment.MachineName + ":8000/Service"; var host = new ServiceHost(typeof(Service),new Uri(baseAddress)); var binding = new WebHttpBinding { ContentTypeMapper = new RawMapper() }; host.AddServiceEndpoint(typeof(ITestService),binding,"").Behaviors.Add(new WebHttpBehavior()); host.open(); Console.WriteLine("Host opened"); var req = (HttpWebRequest)HttpWebRequest.Create(baseAddress + "/test"); req.Method = "POST"; req.ContentType = "application/json"; var reqStream = req.GetRequestStream(); var body = "a test message"; var bodyBytes = new UTF8Encoding(false).GetBytes(body); reqStream.Write(bodyBytes,bodyBytes.Length); reqStream.Close(); var resp = (HttpWebResponse)req.GetResponse(); Console.WriteLine("HTTP/{0} {1} {2}",resp.ProtocolVersion,(int)resp.StatusCode,resp.StatusDescription); foreach (var header in resp.Headers.AllKeys) { Console.WriteLine("{0}: {1}",header,resp.Headers[header]); } Console.WriteLine(); Console.WriteLine(new StreamReader(resp.GetResponseStream()).ReadToEnd()); Console.WriteLine(); } }
顺便说一下,你的传入请求在技术上是不正确的 – 你说(通过Content-Type)你发送的是JSON,但请求体(测试消息)不是有效的JSON字符串(它应该用引号括起来 – “测试消息”改为JSON字符串).