Я изо всех сил пытаюсь настроить тело для http-запроса.

Это то, что я получил от команды интеграции.

"body": {
    "mode": "formdata",
    "formdata": [
        {
            "key": "sourceFile",
            "type": "file",
            "src": "",   /// PDF or CSV file.
            "disabled": true
        }
    ]
}

У меня нет проблем с API. Я не уверен, как установить дополнительные параметры в теле; при отправке ответа он говорит, что исходный файл отсутствует. Это то, что я пробовал:

String boundary = 'DUMMY'; String header = '--'+boundary+'\r\nContent-Disposition: form-data; name="file"; filename="'+file_name+'"\r\nContent-Type: application/octet-stream';
// added '\r's removed ';' see Tim Smith's comment
String footer = '\r\n--'+boundary+'--';
String headerEncoded = EncodingUtil.base64Encode(Blob.valueOf(header+'\r\n\r\n'));

И слияние с телом содержит файл csv или pdf.

-3
Adrian Larson 7 Дек 2018 в 17:42
5
Что ты уже испробовал? Где ты застрял? Если вы взглянете на документы для HttpRequest вы найдете соответствующий API.
 – 
David Reed
7 Дек 2018 в 03:42

4 ответа

Лучший ответ

Вы можете сделать что-то вроде этого:

Http http = new Http();
HttpRequest request = new HttpRequest();
request.setEndpoint('you endpoint');
request.setMethod('POST');

String body = '"mode": "formdata", ' +
              '  "formdata": [ ' +
              '        { ' +
              '            "key": "sourceFile", ' +
              '            "type": "file", ' +
              '              "src": "...",   ' +
              '            "disabled": true' +
              '        }' +
              '      ]';
request.setBody(body);
HttpResponse response = http.send(request);

Вы также можете создать объект Body и использовать класс JSON для его сериализации. Например:

 public class Body {
      public String key;
      public String myType;
      public String src

 }

И используйте его в теле запроса:

 Body reqBody = new Body();
 //set values 
 reqBody.src = EncodingUtil.base64Encode(Blob.valueOf());

 request.setBody(JSON.serialize(reqBody));

Также обратите внимание, что существует ограничение на размер объекта, если вы хотите его сериализовать.

5
kvor 7 Дек 2018 в 17:10
Спасибо квор; я сделал то же самое с небольшими изменениями только в параметрах и смог загрузить файл.
 – 
Raj Mav3rik
11 Дек 2018 в 06:42

У Trailhead есть отличный модуль, который я бы порекомендовал вам:

В нем есть образцы кода, которые вы ищете, наряду с простыми пояснениями. Если вы по-прежнему не можете отправить тело вместе со своим запросом, я бы посоветовал вам обновить свой пост, указав точную проблему вместе с возвращаемой ошибкой, это повысит вероятность получения помощи на форуме.

2
glls 7 Дек 2018 в 05:29

Судя по предоставленной вами дополнительной информации, вызываемая вами служба не является службой JSON REST, а ожидает тело данных формы, состоящее из нескольких частей. JSON, который вы включили в свой вопрос, по-видимому, является спецификацией для этого органа.

Мне кажется, проблема в том, что вы не устанавливаете ключ sourceFile в составном теле данных формы/формы, которое вы создаете, которое ищет ваша удаленная служба.

Предположительно, вы должны установить значение name в sourceFile в части вашего файла, хотя только ваши разработчики интеграции могут сделать это полностью понятным для вас. Трудно понять, какие другие проблемы могут присутствовать в создаваемом теле без более полного примера, и, в конце концов, этот вопрос больше связан с конкретными требованиями интеграции, с которой вы работаете, чем с Salesforce.

2
David Reed 7 Дек 2018 в 17:50

Вот пример кода, который у меня работает:

@future(callout=true)
    public static void BankAccountCSVFile_HTTPCallout(){

        String file_name = 'mav3rik12.csv'; 
        Set<Id> setBillingAccountIds = new set<Id>();
        setBillingAccountIds.add('RecordId');
        SageBankAccountGenerateCSV csv = new SageBankAccountGenerateCSV();
        String file_body = csv.BankAccountCreateCSV(setBillingAccountIds);

        String boundary = '----------------------------741e90d31eff';

        String header = '--'+boundary+'\nContent-Disposition: form-data; name="sourceFile"; filename="'+Utilities.BANK_ACCOUNT_CSV_FILENAME+'";\nContent-Type: application/octet-stream';
        String footer = '--'+boundary+'--';             
        String headerEncoded = EncodingUtil.base64Encode(Blob.valueOf(header+'\r\n\r\n'));

        while(headerEncoded.endsWith('='))
        {
            header+=' ';
            headerEncoded = EncodingUtil.base64Encode(Blob.valueOf(header+'\r\n\r\n'));
        }
        String bodyEncoded = EncodingUtil.base64Encode(blob.valueOf(file_body));

        Blob bodyBlob = null;
        String last4Bytes = bodyEncoded.substring(bodyEncoded.length()-4,bodyEncoded.length());

        if(last4Bytes.endsWith('==')) {
            last4Bytes = last4Bytes.substring(0,2) + '0K';
            bodyEncoded = bodyEncoded.substring(0,bodyEncoded.length()-4) + last4Bytes;
            String footerEncoded = EncodingUtil.base64Encode(Blob.valueOf(footer));
            bodyBlob = EncodingUtil.base64Decode(headerEncoded+bodyEncoded+footerEncoded);
        } else if(last4Bytes.endsWith('=')) {
            last4Bytes = last4Bytes.substring(0,3) + 'N';
            bodyEncoded = bodyEncoded.substring(0,bodyEncoded.length()-4) + last4Bytes;
            footer = '\n' + footer;
            String footerEncoded = EncodingUtil.base64Encode(Blob.valueOf(footer));
            bodyBlob = EncodingUtil.base64Decode(headerEncoded+bodyEncoded+footerEncoded);              
        } else {
            footer = '\r\n' + footer;
            String footerEncoded = EncodingUtil.base64Encode(Blob.valueOf(footer));
            bodyBlob = EncodingUtil.base64Decode(headerEncoded+bodyEncoded+footerEncoded);  
        }

        HttpRequest req = new HttpRequest();
        req.setHeader('Content-Type','multipart/form-data; boundary='+boundary);
        req.setMethod(CatchUtilities.HTTP_POST);
        req.setEndpoint(sENDPOINT);
        req.setHeader('authKey', 'XXXXXXXXXXXXXX');
        req.setBodyAsBlob(bodyBlob);
        req.setTimeout(120000);

        Http http = new Http();
        HTTPResponse res = http.send(req);
    } 
0
Brane 11 Апр 2019 в 18:43
1
Просьба не выкладывать дампы кода без пояснений
 – 
glls
15 Фев 2019 в 05:54