REST POST Request Code Examples
Example 1: Typed POST with Named Credential
public with sharing class RestPostService {
public class RequestBody {
@AuraEnabled public String externalId;
@AuraEnabled public String status;
}
public class ResponseBody {
public String result;
public String correlationId;
}
@AuraEnabled
public static ResponseBody sendPayload(RequestBody payload) {
HttpRequest req = new HttpRequest();
req.setEndpoint('callout:MyNamedCredential/api/resource');
req.setMethod('POST');
req.setHeader('Content-Type', 'application/json');
req.setTimeout(120000);
req.setBody(JSON.serialize(payload));
HttpResponse res = new Http().send(req);
if (res.getStatusCode() >= 200 && res.getStatusCode() < 300) {
return (ResponseBody) JSON.deserialize(res.getBody(), ResponseBody.class);
}
throw new CalloutException('POST failed: ' + res.getStatusCode() + ' ' + res.getBody());
}
}
Example 2: Retry Wrapper for Transient Errors
public with sharing class RestPostRetryService {
public static HttpResponse postWithRetry(HttpRequest req, Integer maxAttempts) {
Integer attempts = 0;
HttpResponse res;
while (attempts < maxAttempts) {
attempts++;
res = new Http().send(req);
Integer code = res.getStatusCode();
if (code >= 200 && code < 300) return res;
if (code != 429 && (code < 500 || code >= 600)) return res;
}
return res;
}
}
Example 3: Test with HttpCalloutMock
@IsTest
private class RestPostServiceTest {
private class SuccessMock implements HttpCalloutMock {
public HTTPResponse respond(HTTPRequest req) {
HttpResponse r = new HttpResponse();
r.setStatusCode(200);
r.setBody('{"result":"ok","correlationId":"abc-123"}');
return r;
}
}
@IsTest
static void sendPayload_success() {
Test.setMock(HttpCalloutMock.class, new SuccessMock());
RestPostService.RequestBody payload = new RestPostService.RequestBody();
payload.externalId = 'EXT-001';
payload.status = 'ACTIVE';
RestPostService.ResponseBody out = RestPostService.sendPayload(payload);
System.assertEquals('ok', out.result);
}
}
Implementation Notes
- Always use Named Credentials, not raw URLs with inline auth.
- Add explicit timeouts and response code handling.
- Include idempotency keys when endpoint supports retries.
- Log correlation IDs to simplify cross-system debugging.