gpt4 book ai didi

java - 带参数的 HTTP 多部分 POST?

转载 作者:太空宇宙 更新时间:2023-11-04 12:58:28 25 4
gpt4 key购买 nike

curl --data "api_user=user&api_key=pwd&to=mymail@gmail.com&toname=Ram&subject=Testtt&from=othermail@gmail.com&text=testingtextbody&--form files[attachment.pdf]=@http://www.tutorialspoint.com/java/pdf/java_strings.pdf;type=application/pdf" https://someendpoint.com/api/mail.send.xml

我有上面的 cURL 命令。我想将上面的调用转换为 HTTP 多部分 POST,因为上面的请求有一个 pdf 附件。我正在做如下。我的多部分 POST 请求构造正确吗?

String boundary = 'delimiter';
String header = '--'+boundary+'\n'; //boundary is random string
String footer = '\n\n--'+boundary+'--'; // blank line separates body/footer
String test='jjjjj';
String bodyText = 'Content-Disposition: form-data; name="files[myfile.pdf]";\n'
+ 'filename="http://www.tutorialspoint.com/java/pdf/java_strings.pdf"\n'
+ 'Content-Type: application/pdf\n\n' // Blank line separates header/body
+ test;


bodyText += '--'+boundary+'\r\nContent-Disposition: form-data; name ="api_user"\r\n\r\n superuser123';
bodyText += '--'+boundary+'\r\nContent-Disposition: form-data; name ="api_key"\r\n\r\n superpwd12345';
bodyText += '--'+boundary+'\r\nContent-Disposition: form-data; name ="to"\r\n\r\n myemail@gmail.com';
bodyText += '--'+boundary+'\r\nContent-Disposition: form-data; name ="from"\r\n\r\n someother@gmail.com';
bodyText += '--'+boundary+'\r\nContent-Disposition: form-data; name ="text"\r\n\r\n hellooooooooooooooooooooooooo';


String body = header + bodyText + footer;
HttpRequest req = new HttpRequest();

req.setHeader('Content-Type','multipart/form-data; boundary='+boundary);
req.setHeader('Content-Length',String.valueof(body.length()));
req.setMethod('POST');
req.setEndpoint('https://someendpoint.com/api/mail.send.xml');
req.setBody(body);
req.setTimeout(60000);
Http http = new Http();
HTTPResponse res = http.send(req);
System.debug('response:'+req.getBody());

谢谢!

最佳答案

阅读有关此主题的以下文章

POST Mutipart/form-data with HttpRequest

Mutipart/form-data with HttpRequest

创建多部分/表单数据请求的正确方法。我使用这个解决方案几次,效果很好

public static void uploadFile(Blob file_body, String file_name, String reqEndPoint){
// Repost of code with fix for file corruption issue
// Orignal code postings and explanations
// http://enreeco.blogspot.in/2013/01/salesforce-apex-post-mutipartform-data.html
// https://salesforce.stackexchange.com/questions/24108/post-multipart-without-base64-encoding-the-body
// Additional changes commented GW: that fix issue with occasional corruption of files
String boundary = '----------------------------741e90d31eff';
String header = '--'+boundary+'\nContent-Disposition: form-data; name="file"; filename="'+file_name+'";\nContent-Type: application/octet-stream';
// GW: Do not prepend footer with \r\n, you'll see why in a moment
// String footer = '\r\n--'+boundary+'--';
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_body);
// GW: Do not encode footer yet
// String footerEncoded = EncodingUtil.base64Encode(Blob.valueOf(footer));

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

// GW: Replacing this entire section
/*
if(last4Bytes.endsWith('='))
{
Blob decoded4Bytes = EncodingUtil.base64Decode(last4Bytes);
HttpRequest tmp = new HttpRequest();
tmp.setBodyAsBlob(decoded4Bytes);
String last4BytesFooter = tmp.getBody()+footer;
bodyBlob = EncodingUtil.base64Decode(headerEncoded+bodyEncoded.substring(0,bodyEncoded.length()-4)+EncodingUtil.base64Encode(Blob.valueOf(last4BytesFooter)));
}
else
{
bodyBlob = EncodingUtil.base64Decode(headerEncoded+bodyEncoded+footerEncoded);
}
*/
// GW: replacement section to get rid of padding without corrupting data
if(last4Bytes.endsWith('==')) {
// The '==' sequence indicates that the last group contained only one 8 bit byte
// 8 digit binary representation of CR is 00001101
// 8 digit binary representation of LF is 00001010
// Stitch them together and then from the right split them into 6 bit chunks
// 0000110100001010 becomes 0000 110100 001010
// Note the first 4 bits 0000 are identical to the padding used to encode the
// second original 6 bit chunk, this is handy it means we can hard code the response in
// The decimal values of 110100 001010 are 52 10
// The base64 mapping values of 52 10 are 0 K
// See http://en.wikipedia.org/wiki/Base64 for base64 mapping table
// Therefore, we replace == with 0K
// Note: if using \n\n instead of \r\n replace == with 'oK'
last4Bytes = last4Bytes.substring(0,2) + '0K';
bodyEncoded = bodyEncoded.substring(0,bodyEncoded.length()-4) + last4Bytes;
// We have appended the \r\n to the Blob, so leave footer as it is.
String footerEncoded = EncodingUtil.base64Encode(Blob.valueOf(footer));
bodyBlob = EncodingUtil.base64Decode(headerEncoded+bodyEncoded+footerEncoded);
} else if(last4Bytes.endsWith('=')) {
// '=' indicates that encoded data already contained two out of 3x 8 bit bytes
// We replace final 8 bit byte with a CR e.g. \r
// 8 digit binary representation of CR is 00001101
// Ignore the first 2 bits of 00 001101 they have already been used up as padding
// for the existing data.
// The Decimal value of 001101 is 13
// The base64 value of 13 is N
// Therefore, we replace = with N
// Note: if using \n instead of \r replace = with 'K'
last4Bytes = last4Bytes.substring(0,3) + 'N';
bodyEncoded = bodyEncoded.substring(0,bodyEncoded.length()-4) + last4Bytes;
// We have appended the CR e.g. \r, still need to prepend the line feed to the footer
footer = '\n' + footer;
String footerEncoded = EncodingUtil.base64Encode(Blob.valueOf(footer));
bodyBlob = EncodingUtil.base64Decode(headerEncoded+bodyEncoded+footerEncoded);
} else {
// Prepend the CR LF to the footer
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('POST');
req.setEndpoint(reqEndPoint);
req.setBodyAsBlob(bodyBlob);
req.setTimeout(120000);

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

关于java - 带参数的 HTTP 多部分 POST?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35156611/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com