【问题标题】:Encoding type of Salesforce HttpPost?(Integration of salesforce & expensify)Salesforce HttpPost 的编码类型?(salesforce & expensify 的整合)
【发布时间】:2015-07-29 06:43:35
【问题描述】:

我需要使用 API 集成 salesforce 和 expensify 并测试 API here。 由于我需要从 salesforce 提出请求,我只能使用 apex 来实现它。 我只需要发送一个可接受的 multipart/form-data Post 请求(包括 JSON 和 CSV 文件)以进行费用化。

我搜索了很多 http://blog.enree.co/2013/01/salesforce-apex-post-mutipartform-data.htmlhttps://developer.salesforce.com/forums/?id=906F000000090JcIAI ,我的代码是这样的:

JSONGenerator gen=JSON.createGenerator(true);
        gen.writeStartObject();
            gen.writeStringField('type', 'update');
            gen.writeFieldName('credentials');
                gen.writeStartObject();
                gen.writeStringField('partnerUserID', 'USERID');
                gen.writeStringField('partnerUserSecret', 'TOKEN');
                gen.writeEndObject();
            gen.writeFieldName('inputSettings');
                gen.writeStartObject();
                gen.writeStringField('type', 'employees');
                gen.writeStringField('policyID', 'policyID');
                gen.writeStringField('fileType', 'csv');
                gen.writeEndObject();
        gen.writeEndObject();                
        String requestJobDescription=gen.getAsString();
        Blob csv=Blob.valueOf('EmployeeEmail,ManagerEmail,Admin\n'+'asidoj@qwe.com,qwdmka@ee.com,FALSE');

      String boundary = '----------------------------wqo12loz741e90d31eff';
      String header2 = '--'+boundary+'\n'+ 'Content-Disposition: form-data; name="data"; filename="1.csv"'+'\nContent-Type: application/octet-stream\n\n';
      String header1andJSON = '--'+boundary+'\nContent-Disposition: form-data;  name="requestJobDescription" \n\r\n\r'+requestJobDescription+'\n';

      String footer = '--'+boundary+'--';             
      String body=header1andJSON+header2+csv.toString()+footer;
      HttpRequest req = new HttpRequest();
      req.setHeader('Content-Type','multipart/form-data; boundary='+boundary);
      req.setMethod('POST');
      req.setEndpoint('https://integrations.expensify.com/Integration-Server/ExpensifyIntegrations');
      req.setBody(body);
      req.setTimeout(120000);

      Http http = new Http();
      HTTPResponse res = http.send(req);

问题是发送请求后,我得到了类似

的响应
{"responseMessage":"Error in multipart initialization","responseCode":500}

可能是编码类型或者我不知道的原因造成的。

我真的很困惑,有人可以帮忙吗? 如果您需要更多信息,请告诉我!

【问题讨论】:

    标签: salesforce httprequest apex-code apex


    【解决方案1】:

    最后我在一些 javascript 演示代码的启发下自己解决了这个问题。我上面的代码的问题是它不完全符合Http标准,它是由http请求中的“\n\r”东西引起的。代码工作是这样的

        //Create a Json and convert it to String
        JSONGenerator gen=JSON.createGenerator(true);
        gen.writeStartObject();
            gen.writeStringField('type', 'update');
            gen.writeFieldName('credentials');
                gen.writeStartObject();
                gen.writeStringField('partnerUserID', 'userID');//Should be changed 
                gen.writeStringField('partnerUserSecret', 'token');//Should be changed
                gen.writeEndObject();
            gen.writeFieldName('inputSettings');
                gen.writeStartObject();
                gen.writeStringField('type', 'employees');
                gen.writeStringField('policyID', 'ID');//the policyID corresponding to the policy which the employees will be added to;
                gen.writeStringField('fileType', 'csv');
                gen.writeEndObject();
        gen.writeEndObject();
        String requestJobDescription=gen.getAsString();
    
      String boundary = '-----------------------------BoundaryjQjTqoyRD07HQCVD';
      String header2 = '--'+boundary+'\n'+ 'Content-Disposition: form-data; name="data"; filename="1.csv"'+'\r\nContent-Type: application/octet-stream\r\n\r\n';
      String header1 = '--'+boundary+'\n Content-Disposition: form-data;  name="requestJobDescription" \r\n\r\n'+requestJobDescription+'\r\n';
    
      String footer = '--'+boundary+'--';             
      String body=header1+header2+CSVString+'\r\n'+footer;//the CSVString is like 'EmployeeEmail,ManagerEmail,Admin\n'+'asidoj@qwe.com,qwdmka@ee.com,FALSE'
    
      HttpRequest req = new HttpRequest();
      req.setHeader('Content-Type','multipart/form-data; boundary='+boundary);
      req.setMethod('POST');
      req.setEndpoint('https://integrations.expensify.com/Integration-Server/ExpensifyIntegrations');
      req.setBody(body);
      req.setTimeout(120000);
    
      Http http = new Http();
      HTTPResponse res = http.send(req);
    

    【讨论】:

      猜你喜欢
      • 2019-10-11
      • 1970-01-01
      • 2021-07-09
      • 1970-01-01
      • 1970-01-01
      • 2023-04-08
      • 1970-01-01
      • 2013-10-16
      • 1970-01-01
      相关资源
      最近更新 更多