Ten en cuenta que en las ciencias informáticas un error casi siempere puede tener varias resoluciones, no obstante nosotros aquí enseñamos lo mejor y más óptimo.
Solución:
Post-Invierno 21
Como mencionó Daniel Ballinger en su nueva respuesta a continuación (https://salesforce.stackexchange.com/a/317712/2429): ¡Invierno 21 brindará soporte para esto por fin! Consulte https://releasenotes.docs.salesforce.com/en-us/winter21/release-notes/rn_apex_callouts_patch.htm
Pre-Invierno 21
Actualice esta respuesta, hay 2 soluciones para el verbo PATCH faltante en HttpRequest
que pueden funcionar en algunos contextos específicos:
- Si está llamando A Salesforce, DESDE Salesforce (por ejemplo, una integración entre dos organizaciones), puede agregar
?_HttpMethod=PATCH
hasta el punto final. Tenga en cuenta que esto no es una característica de laHttpRequest
objeto, no hace nada inteligente con esto; más bien, esta es una solución que Salesforce tiene para permitir que las personas que llaman a sus API REST realicen llamadas PATCH cuando la persona que llama no permite el verbo PATCH (que irónicamente es un problema Salesforce mismo sufre). Es decir, esto no le ayudará si está llamando a un sistema que no es de Salesforce. Consulte https://developer.salesforce.com/docs/atlas.en-us.api_rest.meta/api_rest/dome_update_fields.htm:
Si usa una biblioteca HTTP que no permite anular o establecer un nombre de método HTTP arbitrario, puede enviar una solicitud POST y proporcionar una anulación del método HTTP a través de la consulta string parámetro _HttpMethod. En el ejemplo de PATCH, puede reemplazar la línea PostMethod con una que no use anulación:
PostMethod m = new PostMethod(url + "?_HttpMethod=PATCH");
- Como señaló @zachelrath en su respuesta a esta pregunta (https://salesforce.stackexchange.com/a/77833/2429), configurar el encabezado
X-HTTP-Method-Override
es una opción, por ejemploreq.setMethod('POST');
req.setHeader('X-HTTP-Method-Override','PATCH');
Sin embargo, esta es una convención que siguen algunos servidores para admitir bibliotecas que no admiten ciertos verbos HTTP, en lugar de una garantía de éxito. Esto NO funciona cuando se llama a Salesforce, Salesforce ignora este encabezado.
Si ninguna de las opciones anteriores funciona, parece que no es posible usar Apex solo, sin algún tipo de middleware (por ejemplo, proxy Heroku para convertir ciertos POST en PATCH, o [horror of horrors] una página ficticia de visualforce para ejecutar un XHR), que ha indicado que no es una opción.
Parece que la razón de esto podría deberse a que Salesforce detrás de escena está usando JDK HttpURLConnection
, que restringe los verbos http que puede usar a los valores predeterminados de HTTP/1.1. Este informe de errores para su problema en un contexto JDK/HttpUrlConnection que encontré está marcado como “No se solucionará” en OpenJDK: https://bugs.openjdk.java.net/browse/JDK-7016595. Tenga en cuenta que la descripción y el mensaje de error coinciden con su problema.
Esta otra pregunta de StackExchange indica que es un problema en los JDK 6, 7 y 8 (y supongo que antes): https://stackoverflow.com/questions/17780693/ – la misma frase de error sigue siendo: Invalid HTTP method: PATCH
Tuve esta misma experiencia recientemente cuando intenté hacer una llamada a la API de Google Calendar, y aparentemente hay una práctica común de servidores que escuchan un X-HTTP-Method-Override
encabezado donde pasa el método HTTP deseado para usar, pero luego establece el método de solicitud en POST
:
req.setHeader('X-HTTP-Method-Override','PATCH');
req.setMethod('POST');
Para el contexto, aquí hay un ejemplo más completo:
String eventId = 'abcdefghijklmnop';
String user = '[email protected]';
user = EncodingUtil.urlEncode(user, 'UTF-8');
Http h = new Http();
HttpRequest req = new HttpRequest();
req.setEndpoint(
'https://www.googleapis.com/calendar/v3/calendars/'+user+'/events/'+eventId
);
req.setBody(' "Description" : "test description ');
req.setHeader('Authorization', 'Bearer ' + authToken);
req.setHeader('Content-Type', 'application/json');
req.setHeader('X-HTTP-Method-Override','PATCH');
req.setMethod('POST');
HttpResponse res = h.send(req);
Las notas de la versión de Winter `21 (v50.0) indican que la compatibilidad con PATCH llegará a Apex.
Actualizar recursos con el método HTTP PATCH en llamadas de Apex
Para realizar actualizaciones parciales o completas de un recurso en un servicio web HTTP, especifique el método PATCH en la clase HttpRequest. Anteriormente, solo se admitía el método PUT para actualizaciones completas.
Si para ti ha resultado de provecho nuestro artículo, agradeceríamos que lo compartas con el resto juniors así contrubuyes a extender nuestro contenido.