3

我正在调用 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 ..

4

3 回答 3

4

FluidSurveys 开发人员在这里。

看起来您正在执行 POST 请求,根据文档,该请求用于创建新响应。但是您的函数名为 getData,所以我假设您想要获取响应列表?

将请求类型从 GET 更改为 POST,它应该开始工作。

此外,响应类型将为 application/json,但您不应将请求类型设置为该编码。

如果我弄错了并且您希望提交新的响应,那么此代码将不起作用,因为您实际上并没有传递任何内容。正如您在http://docs.fluidsurveys.com/api/surveys.html#submitting-a-new-response看到的那样,您实际上需要传递问题 ID 和答案的字典。找出 id 是什么或格式是什么的最好方法是首先查看从 GET 请求返回的响应。

于 2013-04-19T14:46:01.360 回答
1

我的代码的问题是我设置了内容长度标头,但没有设置任何正文,服务器正在努力等待 3199 字节的正文。所以在使用 setBody 方法后,我的代码正确地返回了一个 json 响应

于 2013-04-22T09:19:34.627 回答
0

我想补充一下这个答案,因为我发现由于入侵检测规则,来自 Apex 的一些消息被发布到外部端点被另一端的防火墙丢弃。

显然,在 Apex 端,出站消息不符合某些阻止中间人攻击的构造规则,并且某些防火墙或 IDS 正在阻止它们。这将在 Apex 端显示为“读取超时”。

具体的 IDS 规则是 CVE-2009-3555 ( http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2009-3555 )。

如果您在 Apex 中遇到对外部端点的读取超时并且无法将它们隔离到 apex 编程,您可能会在目标防火墙上进行一些日志记录以查看是否是问题所在,如果是,请在该防火墙中创建一个例外这种情况。

于 2013-11-19T16:37:15.650 回答