Регистрация  |  Вход

Panda doc + Salesforce - есть вопрос

Исходя из требований PandaDoc API
https://developers.pandadoc.com/reference#create-document-from-pdf
нам надо сделать интеграцию с помощью POST Mutipart/form-data with HttpRequest
нашел вот такой ворэраунд http://enreeco.blogspot.com/2013/01/salesforce-apex-post-mutipartform-data.html

, но мне надо засунуть еще туда параметры ,как в доке это описано .

чето я не знаю кук правилно это сделать, может у кого есть идеи?

{  
"name": "Sample Document from PDF with Field Tags",
"url": "https://cdn2.hubspot.net/hubfs/2127247/public-templates/SamplePandaDocPdf_FieldTags.pdf",
"tags": [
"tag_1",
"tag_2"
],
"recipients": [
{
"email": "jane@example.com",
"first_name": "Jane",
"last_name": "Doe",
"role": "user"
}
],
"fields": {
"name": {
"value": "John",
"role": "user"
},
"like": {
"value": true,
"role": "user"
}
},
"metadata": {
"salesforce.opportunity_id": "123456",
"my_favorite_pet": "Panda"
},
"parse_form_fields": false
}

Исходя из требований PandaDoc API
https://developers.pandadoc.com/reference#create-document-from-pdf
нам надо сделать интеграцию с помощью POST Mutipart/form-data with HttpRequest
нашел вот такой ворэраунд http://enreeco.blogspot.com/2013/01/salesforce-apex-post-mutipartform-data.html

, но мне надо засунуть еще туда параметры ,как в доке это описано .

чето я не знаю кук правилно это сделать, может у кого есть идеи?
[code]{  
    "name": "Sample Document from PDF with Field Tags",
    "url": "https://cdn2.hubspot.net/hubfs/2127247/public-templates/SamplePandaDocPdf_FieldTags.pdf",
    "tags": [
       "tag_1",
       "tag_2"
    ],
    "recipients": [  
        {  
            "email": "jane@example.com",
            "first_name": "Jane",
            "last_name": "Doe",
            "role": "user"
        }
    ],
    "fields": {  
        "name": {  
            "value": "John",
            "role": "user"
        },
        "like": {  
            "value": true,
            "role": "user"
        }
    },
    "metadata": {
        "salesforce.opportunity_id": "123456",
        "my_favorite_pet": "Panda"
    },
    "parse_form_fields": false
}[/code]


А зачем его куда-то вставлять?
Зачем было вообще выдерать этот JSON из тела запроса чтобы потом спросить куда его вставить?
Туда обратно его и надо вставить - в RAW Request Body.
В доке показано полностью тело POST запроса которое надо отсылать.

Еще для информации вот тема
https://salesforce-developer.ru/forum/topic-otpravka-attachmentov-v-sendgrid
Тут переработанный вариант Mutipart/form-data для Apex (но для другого сервиса).
Может поможет.

А зачем его куда-то вставлять?
Зачем было вообще выдерать этот JSON из тела запроса чтобы потом спросить куда его вставить?
Туда обратно его и надо вставить :) - в RAW Request Body.
В доке показано полностью тело POST запроса которое надо отсылать.

Еще для информации вот тема 
https://salesforce-developer.ru/forum/topic-otpravka-attachmentov-v-sendgrid
Тут переработанный вариант Mutipart/form-data для Apex (но для другого сервиса).
Может поможет.

Dmitry Shnyrev
А зачем его куда-то вставлять?
Зачем было вообще выдерать этот JSON из тела запроса чтобы потом спросить куда его вставить?
Туда обратно его и надо вставить - в RAW Request Body.
В доке показано полностью тело POST запроса которое надо отсылать.

Еще для информации вот тема
https://salesforce-developer.ru/forum/topic-otpravka-attachmentov-v-sendgrid
Тут переработанный вариант Mutipart/form-data для Apex (но для другого сервиса).
Может поможет.

мой вопрос про то, как правильно спомпоновать этот json вместе во всем остальным. ну то есть файл мы можем передать как указано в примере, а как еще туда добавить вот эти параметры....

[quote="Dmitry Shnyrev"]А зачем его куда-то вставлять?
Зачем было вообще выдерать этот JSON из тела запроса чтобы потом спросить куда его вставить?
Туда обратно его и надо вставить :) - в RAW Request Body.
В доке показано полностью тело POST запроса которое надо отсылать.

Еще для информации вот тема 
https://salesforce-developer.ru/forum/topic-otpravka-attachmentov-v-sendgrid
Тут переработанный вариант Mutipart/form-data для Apex (но для другого сервиса).
Может поможет.[/quote]

мой вопрос про то, как правильно спомпоновать этот json вместе во всем остальным. ну то есть файл мы можем передать как указано в примере, а как еще туда добавить вот эти параметры....

Зачем его скомпоновывать? Этот JSON просто текст внутри POST запроса.

Вот само тело запроса из доки по ссылке

------WebKitFormBoundaryXXXXXXXXXXXXXXX
Content-Disposition: form-data; name="file"; filename="Sample PandaDoc PDF with Field Tags.pdf"
Content-Type: application/pdf


------WebKitFormBoundaryXXXXXXXXXXXXXXX
Content-Disposition: form-data; name="data"

{
"name": "Sample Document from PDF with Field Tags",
"url": "https://cdn2.hubspot.net/hubfs/2127247/public-templates/SamplePandaDocPdf_FieldTags.pdf",
"tags": [
"tag_1",
"tag_2"
],
"recipients": [
{
"email": "jane@example.com",
"first_name": "Jane",
"last_name": "Doe",
"role": "user"
}
],
"fields": {
"name": {
"value": "John",
"role": "user"
},
"like": {
"value": true,
"role": "user"
}
},
"metadata": {
"salesforce.opportunity_id": "123456",
"my_favorite_pet": "Panda"
},
"parse_form_fields": false
}

------WebKitFormBoundaryXXXXXXXXXXXXXXX--

Зачем его скомпоновывать? Этот JSON просто текст внутри POST запроса. 

Вот само тело запроса из доки по ссылке

[code]------WebKitFormBoundaryXXXXXXXXXXXXXXX
Content-Disposition: form-data; name="file"; filename="Sample PandaDoc PDF with Field Tags.pdf"
Content-Type: application/pdf


------WebKitFormBoundaryXXXXXXXXXXXXXXX
Content-Disposition: form-data; name="data"

[b]{  
    "name": "Sample Document from PDF with Field Tags",
    "url": "https://cdn2.hubspot.net/hubfs/2127247/public-templates/SamplePandaDocPdf_FieldTags.pdf",
    "tags": [
       "tag_1",
       "tag_2"
    ],
    "recipients": [  
        {  
            "email": "jane@example.com",
            "first_name": "Jane",
            "last_name": "Doe",
            "role": "user"
        }
    ],
    "fields": {  
        "name": {  
            "value": "John",
            "role": "user"
        },
        "like": {  
            "value": true,
            "role": "user"
        }
    },
    "metadata": {
        "salesforce.opportunity_id": "123456",
        "my_favorite_pet": "Panda"
    },
    "parse_form_fields": false
}[/b]
------WebKitFormBoundaryXXXXXXXXXXXXXXX--[/code]


Dmitry Shnyrev
Зачем его скомпоновывать? Этот JSON просто текст внутри POST запроса.

Вот само тело запроса из доки по ссылке

------WebKitFormBoundaryXXXXXXXXXXXXXXX
Content-Disposition: form-data; name="file"; filename="Sample PandaDoc PDF with Field Tags.pdf"
Content-Type: application/pdf


------WebKitFormBoundaryXXXXXXXXXXXXXXX
Content-Disposition: form-data; name="data"

{
"name": "Sample Document from PDF with Field Tags",
"url": "https://cdn2.hubspot.net/hubfs/2127247/public-templates/SamplePandaDocPdf_FieldTags.pdf",
"tags": [
"tag_1",
"tag_2"
],
"recipients": [
{
"email": "jane@example.com",
"first_name": "Jane",
"last_name": "Doe",
"role": "user"
}
],
"fields": {
"name": {
"value": "John",
"role": "user"
},
"like": {
"value": true,
"role": "user"
}
},
"metadata": {
"salesforce.opportunity_id": "123456",
"my_favorite_pet": "Panda"
},
"parse_form_fields": false
}

------WebKitFormBoundaryXXXXXXXXXXXXXXX--

public static void uploadFile(Blob file, String file_name, String reqEndPoint){
String boundary = '------WebKitFormBoundaryXXXXXXXXXXXXXXX';
String data = '{' +
'"name": "Sample Document from PDF with Field Tags", ' +
'"url": "https://cdn2.hubspot.net/hubfs/2127247/public-templates/SamplePandaDocPdf_FieldTags.pdf", ' +
'"tags": ["tag_1", "tag_2" ], ' +
'"recipients": [{ "email":"jane@example.com", "first_name": "Jane", "last_name": "Doe","role": "user"}], ' +
'"fields": { "name": { "value": "John","role": "user" }, ' +
'"like": {"value": true, "role": "user"} }, ' +
'"metadata": { "salesforce.opportunity_id": "123456", "my_favorite_pet": "Panda" }, ' +
'"parse_form_fields": false }';

String json = JSON.serialize(data);
String header = boundary+
'\nContent-Disposition: form-data; name="file"; filename="'+file_name+'"' +
'\nContent-Type: application/octet-stream' +
'\n'+boundary+
'\nContent-Disposition: form-data; name="data' +'\n'+json +'\n'+
''+boundary;

System.debug(header);
//String header = '--'+boundary+'\nContent-Disposition: form-data; name="file"; filename="'+file_name+'";\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(file);

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.setHeader('Authorization', 'API-Key '+ str1);
req.setMethod('POST');
req.setEndpoint(reqEndPoint);
req.setBodyAsBlob(bodyBlob);
req.setTimeout(120000);

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


System.debug(res.getBody());
}


такого плана ты имеешь в виду?

[quote="Dmitry Shnyrev"]Зачем его скомпоновывать? Этот JSON просто текст внутри POST запроса. 

Вот само тело запроса из доки по ссылке

[code]------WebKitFormBoundaryXXXXXXXXXXXXXXX
Content-Disposition: form-data; name="file"; filename="Sample PandaDoc PDF with Field Tags.pdf"
Content-Type: application/pdf


------WebKitFormBoundaryXXXXXXXXXXXXXXX
Content-Disposition: form-data; name="data"

[b]{  
    "name": "Sample Document from PDF with Field Tags",
    "url": "https://cdn2.hubspot.net/hubfs/2127247/public-templates/SamplePandaDocPdf_FieldTags.pdf",
    "tags": [
       "tag_1",
       "tag_2"
    ],
    "recipients": [  
        {  
            "email": "jane@example.com",
            "first_name": "Jane",
            "last_name": "Doe",
            "role": "user"
        }
    ],
    "fields": {  
        "name": {  
            "value": "John",
            "role": "user"
        },
        "like": {  
            "value": true,
            "role": "user"
        }
    },
    "metadata": {
        "salesforce.opportunity_id": "123456",
        "my_favorite_pet": "Panda"
    },
    "parse_form_fields": false
}[/b]
------WebKitFormBoundaryXXXXXXXXXXXXXXX--[/code][/quote]



[code]public static void uploadFile(Blob file, String file_name, String reqEndPoint){
        String boundary = '------WebKitFormBoundaryXXXXXXXXXXXXXXX';
        String data = '{' +
                '"name": "Sample Document from PDF with Field Tags", ' +
                '"url": "https://cdn2.hubspot.net/hubfs/2127247/public-templates/SamplePandaDocPdf_FieldTags.pdf", ' +
                '"tags": ["tag_1", "tag_2" ], ' +
                '"recipients": [{ "email":"jane@example.com", "first_name": "Jane", "last_name": "Doe","role": "user"}], ' +
                '"fields": { "name": { "value": "John","role": "user" }, ' +
                '"like": {"value": true, "role": "user"} }, ' +
                '"metadata": {  "salesforce.opportunity_id": "123456", "my_favorite_pet": "Panda"  },  ' +
                '"parse_form_fields": false }';

        String json = JSON.serialize(data);
        String header = boundary+
                '\nContent-Disposition: form-data; name="file"; filename="'+file_name+'"' +
                '\nContent-Type: application/octet-stream' +
                '\n'+boundary+
                '\nContent-Disposition: form-data; name="data' +'\n'+json +'\n'+
                ''+boundary;

        System.debug(header);
        //String header = '--'+boundary+'\nContent-Disposition: form-data; name="file"; filename="'+file_name+'";\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(file);

        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.setHeader('Authorization', 'API-Key '+ str1);
        req.setMethod('POST');
        req.setEndpoint(reqEndPoint);
        req.setBodyAsBlob(bodyBlob);
        req.setTimeout(120000);

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


      System.debug(res.getBody());
    }[/code]
такого плана ты имеешь в виду?

Dmitry Shnyrev
Зачем его скомпоновывать? Этот JSON просто текст внутри POST запроса.

Вот само тело запроса из доки по ссылке

------WebKitFormBoundaryXXXXXXXXXXXXXXX
Content-Disposition: form-data; name="file"; filename="Sample PandaDoc PDF with Field Tags.pdf"
Content-Type: application/pdf


------WebKitFormBoundaryXXXXXXXXXXXXXXX
Content-Disposition: form-data; name="data"

{
"name": "Sample Document from PDF with Field Tags",
"url": "https://cdn2.hubspot.net/hubfs/2127247/public-templates/SamplePandaDocPdf_FieldTags.pdf",
"tags": [
"tag_1",
"tag_2"
],
"recipients": [
{
"email": "jane@example.com",
"first_name": "Jane",
"last_name": "Doe",
"role": "user"
}
],
"fields": {
"name": {
"value": "John",
"role": "user"
},
"like": {
"value": true,
"role": "user"
}
},
"metadata": {
"salesforce.opportunity_id": "123456",
"my_favorite_pet": "Panda"
},
"parse_form_fields": false
}

------WebKitFormBoundaryXXXXXXXXXXXXXXX--


Спасибо, твой пример помог, еще раз большое спасибо!

[quote="Dmitry Shnyrev"]Зачем его скомпоновывать? Этот JSON просто текст внутри POST запроса. 

Вот само тело запроса из доки по ссылке

[code]------WebKitFormBoundaryXXXXXXXXXXXXXXX
Content-Disposition: form-data; name="file"; filename="Sample PandaDoc PDF with Field Tags.pdf"
Content-Type: application/pdf


------WebKitFormBoundaryXXXXXXXXXXXXXXX
Content-Disposition: form-data; name="data"

[b]{  
    "name": "Sample Document from PDF with Field Tags",
    "url": "https://cdn2.hubspot.net/hubfs/2127247/public-templates/SamplePandaDocPdf_FieldTags.pdf",
    "tags": [
       "tag_1",
       "tag_2"
    ],
    "recipients": [  
        {  
            "email": "jane@example.com",
            "first_name": "Jane",
            "last_name": "Doe",
            "role": "user"
        }
    ],
    "fields": {  
        "name": {  
            "value": "John",
            "role": "user"
        },
        "like": {  
            "value": true,
            "role": "user"
        }
    },
    "metadata": {
        "salesforce.opportunity_id": "123456",
        "my_favorite_pet": "Panda"
    },
    "parse_form_fields": false
}[/b]
------WebKitFormBoundaryXXXXXXXXXXXXXXX--[/code][/quote]
Спасибо, твой пример помог, еще раз большое спасибо! 

cool
Спасибо, твой пример помог, еще раз большое спасибо!

Отлично! Правильно поставленный вопрос это 50% ответа

[quote="cool"]Спасибо, твой пример помог, еще раз большое спасибо![/quote]
Отлично! Правильно поставленный вопрос это 50% ответа :D