我正在调用FluidSurvey的API。当我发出POST请求时......它在fluidSurvey上发布请求,但我没有得到JSON响应。而它什么也没有回报。任何建议??
我的控制器代码
public class fluidSurvey{
public String tst{set;get;}
public String result{get;set;}
public PageReference chk() {
getData();
return null;
}
public void getData(){
String apiKey = 'xxxxxx';
String pwd = 'xxxxxx';
String u = 'https://app.fluidsurveys.com/api/v2/surveys/survey_id/responses/';
HttpRequest req = new HttpRequest();
Http http = new Http();
HTTPResponse res;
try{
req.setEndPoint(u);
req.setTimeout(2000);
req.setMethod('POST');
Blob headerValue = Blob.valueOf(apikey + ':' + pwd);
String authorizationHeader = 'Basic '+ EncodingUtil.base64Encode(headerValue);
req.setHeader('Authorization', authorizationHeader);
req.setHeader('Content-Type', 'application/json');
req.setHeader('Content-Length','31999');
res = http.send(req);
tst= res.toString();
catch(Exception e){
System.debug('Callout error: '+ e);
System.debug(tst+'--------'+res);
}
}
}
和Apex页面代码是
<apex:page controller="fluidSurvey">
<apex:form >
<apex:pageBlock title="New Fluid Surveys API">
<apex:outputText value="{!tst}"></apex:outputText><br/>
<apex:pageBlockButtons location="bottom">
<apex:commandButton value="Submit" action="{!chk}"/>
</apex:pageBlockButtons>
</apex:pageBlock>
</apex:form>
和api文档链接是http://docs.fluidsurveys.com/api/surveys.html#getting-a-list-of-surveys ..
答案 0 :(得分:4)
FluidSurveys Dev here。
看起来你正在做一个POST请求,根据文档用于创建新响应。但是你的函数名为getData,所以我假设你想获得一个响应列表?
将请求类型从GET更改为POST,它应该开始工作。
此外,响应类型将是application / json,但您不应将请求类型设置为该编码。
如果我错了并且您想要提交新的回复,那么此代码无法正常工作,因为您实际上并未传递任何内容。 正如您在http://docs.fluidsurveys.com/api/surveys.html#submitting-a-new-response所看到的,您需要实际传递问题ID和答案的字典。找出ID是什么或格式是什么的最好方法是首先查看从GET请求返回的响应。
答案 1 :(得分:1)
我的代码的问题是我设置了内容长度标题,但没有设置任何正文,服务器正在努力等待3199字节的正文。所以在使用setBody方法后,我的代码正确地返回了一个json响应
答案 2 :(得分:0)
我想补充一点,因为我发现由于入侵检测规则,Apex发布到外部端点的一些消息被另一端的防火墙丢弃了。
显然,在Apex端有些情况下,出站消息不符合某些防止中间人攻击的构造规则,而某些防火墙或IDS阻止它们。这将在Apex侧显示为“读取超时”。
具体的IDS规则是CVE-2009-3555(http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2009-3555)。
如果您在Apex中遇到外部端点的读取超时并且无法将它们隔离到顶点编程,您可能会在目标防火墙上执行一些日志记录以查看是否存在此问题,如果是,请在以下位置创建例外这类案件的防火墙。