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

Как с помощью REST API и Batch вытаскивать свыше 250 записей?

У меня есть коллаут и батч, который его вызывает (сам батч, скорее всего, кривой: я так и не смогла до конца в них разобраться). Коллаут обращается к 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]

Извините, но пока код выглядит как полный бред.
Давайте начнем с начала. Какая изначальная задумка? Что должно происходить простыми словами, не опираясь пока на какие-либо варианты реализации.

Извините, но пока код выглядит как полный бред.
Давайте начнем с начала. Какая изначальная задумка? Что должно происходить простыми словами, не опираясь пока на какие-либо варианты реализации.