У меня есть коллаут и батч, который его вызывает (сам батч, скорее всего, кривой: я так и не смогла до конца в них разобраться). Коллаут обращается к REST API GET, но даже если на стороне сервисной части у меня более 250 записей, оно все равно вернет ровно 250. Это ограничение батча, насколько я понимаю? Можно ли организовать эту передачу по частям? К примеру, в несколько заходов по 250 записей, пока записи не закончатся (принцип пагинации). И если да, то как это сделать? Где-то читала, что посредством встроенного REST API записи можно десятками тысяч тянуть, но не пойму, как это сделать, если мы работаем только со стороной запроса. Помогите, пожалуйста. Заранее спасибо за ответы.
Коллаут:
public class Callout {
public static List<Instrument__c> instrumentsList;public static HttpRequest createRequestForService(String token){
HttpRequest finalRequest = new HttpRequest();
finalRequest.setHeader('Authorization','Bearer ' + token);
finalRequest.setHeader('Content-Type','application/json');
finalRequest.setHeader('accept','application/json');
finalRequest.setMethod('GET');
finalRequest.setEndpoint('https://name.salesforce.com/services/data/v44.0/query/?q=SELECT+Name+FROM+InstrumentFromService__c');
return finalRequest;
}
public class WrapperClass {
public Integer totalSize;
public Boolean done;
public String nextRecordsUrl;
public Instrument__c[] records;
}
public class WebToken{
public String WEBTOK{get;set;}
}
public static void getResult() {
Http ourHttp = new Http();
HttpRequest requestForToken = 'get_right_token_is_here';
HttpResponse responseToken = ourHttp.send(requestForToken);
OAuth2 objAuthenticationInfo = (WebToken)JSON.deserialize(responseToken.getbody(), WebToken.class);if(objAuthenticationInfo.WEBTOK != null) {
HttpRequest requestForService = createRequestForService(objAuthenticationInfo.WEBTOK);
HttpResponse responseService = ourHttp.send(requestForService);
instrumentsList = ((WrapperClass)JSON.deserialize(responseService.getBody(), WrapperClass.class)).records;
for(Instrument__c ins : instrumentsList) {
ins.Id = null;
}
return responseService;
}
else return null;
}
}
global class BatchClass implements Database.Batchable<Integer>, Database.AllowsCallouts {
global Integer operationsQuantity = 1;
global Iterable<Integer> start(Database.BatchableContext BC){
List<Integer> scope = new List<Integer>();
for(Integer i = 1; i <= operationsQuantity; i++){
scope.add(i);
}
return scope;
}
global void execute(Database.BatchableContext BC, List<Integer> scope){
List<Instrument__c> mainList = new List<Instrument__c>();
for(Integer i : scope){
HttpResponse res = CalloutResume.getCalloutResponseContents();
List<Instrument__c> instrumentsList = Callout.instrumentsList;
mainList.addAll(instrumentsList);
}
upsert mainList Name;
}
global void finish(Database.BatchableContext BC){
}
}
У меня есть коллаут и батч, который его вызывает (сам батч, скорее всего, кривой: я так и не смогла до конца в них разобраться). Коллаут обращается к REST API GET, но даже если на стороне сервисной части у меня более 250 записей, оно все равно вернет ровно 250. Это ограничение батча, насколько я понимаю? Можно ли организовать эту передачу по частям? К примеру, в несколько заходов по 250 записей, пока записи не закончатся (принцип пагинации). И если да, то как это сделать? Где-то читала, что посредством встроенного REST API записи можно десятками тысяч тянуть, но не пойму, как это сделать, если мы работаем только со стороной запроса. Помогите, пожалуйста. Заранее спасибо за ответы. Коллаут: [code]public class Callout { public static List<Instrument__c> instrumentsList; public static HttpRequest createRequestForService(String token){ HttpRequest finalRequest = new HttpRequest(); finalRequest.setHeader('Authorization','Bearer ' + token); finalRequest.setHeader('Content-Type','application/json'); finalRequest.setHeader('accept','application/json'); finalRequest.setMethod('GET'); finalRequest.setEndpoint('https://name.salesforce.com/services/data/v44.0/query/?q=SELECT+Name+FROM+InstrumentFromService__c'); return finalRequest; } public class WrapperClass { public Integer totalSize; public Boolean done; public String nextRecordsUrl; public Instrument__c[] records; } public class WebToken{ public String WEBTOK{get;set;} } public static void getResult() { Http ourHttp = new Http(); HttpRequest requestForToken = 'get_right_token_is_here'; HttpResponse responseToken = ourHttp.send(requestForToken); OAuth2 objAuthenticationInfo = (WebToken)JSON.deserialize(responseToken.getbody(), WebToken.class); if(objAuthenticationInfo.WEBTOK != null) { HttpRequest requestForService = createRequestForService(objAuthenticationInfo.WEBTOK); HttpResponse responseService = ourHttp.send(requestForService); instrumentsList = ((WrapperClass)JSON.deserialize(responseService.getBody(), WrapperClass.class)).records; for(Instrument__c ins : instrumentsList) { ins.Id = null; } return responseService; } else return null; } }[/code] Батч: [code]global class BatchClass implements Database.Batchable<Integer>, Database.AllowsCallouts { global Integer operationsQuantity = 1; global Iterable<Integer> start(Database.BatchableContext BC){ List<Integer> scope = new List<Integer>(); for(Integer i = 1; i <= operationsQuantity; i++){ scope.add(i); } return scope; } global void execute(Database.BatchableContext BC, List<Integer> scope){ List<Instrument__c> mainList = new List<Instrument__c>(); for(Integer i : scope){ HttpResponse res = CalloutResume.getCalloutResponseContents(); List<Instrument__c> instrumentsList = Callout.instrumentsList; mainList.addAll(instrumentsList); } upsert mainList Name; } global void finish(Database.BatchableContext BC){ } }[/code]
Извините, но пока код выглядит как полный бред.
Давайте начнем с начала. Какая изначальная задумка? Что должно происходить простыми словами, не опираясь пока на какие-либо варианты реализации.
Извините, но пока код выглядит как полный бред. Давайте начнем с начала. Какая изначальная задумка? Что должно происходить простыми словами, не опираясь пока на какие-либо варианты реализации.