traitement par lots pour la requête httpBonjour,
J'essaie d'écrire un script qui envoie une requête http en créant un point de terminaison.
La préparation de la demande elle-même n'est pas un problème, mais dans certains cas, je dois demander des informations sur plus de 1 000 éléments (test_article) à la fois.
Je suis limité par la longueur maximale de la requête http à en demander environ 1 000 à la fois.
Malheureusement, je n'ai pas réussi à comprendre comment créer une boucle qui enverrait des demandes de lots de 1 000 test_article et les concatènerait au fur et à mesure de leur réception.
Toute idée serait grandement apprécié
Modélisation statistique avancéeAutomatisation et scriptsÉtudes de consommation et de marchéMélange et nettoyage des donnéesIngénierie Qualité et ProcédésRe : traitement par lots pour une requête httpSalut Ryan,
Merci d'avoir répondu. Je vais voir si je peux adapter votre suggestion au problème que j'ai répertorié ci-dessous.
Meilleur,
SébastienRe : traitement par lots pour une requête httpJ'ai réalisé que j'avais laissé de côté les scripts que je commençais lors de ma demande initiale. Par souci de clarté, voici le script de point de départ. J'aimerais trouver un moyen de décomposer en lots lorsque le nombre d'éléments dépasse 1 000.
Meilleur
Names Default To Here( 1 );
dt = Data Table( "test_article" ); // This is a summary data table only contains 1 column of interest 'test_article' - I want to retrieve some info for each of the unique items in that column
//If the number of items exceeds 1000, I'll need to break down the query in batches of 1000 or less to construct the http request
//Right if the list is 1000 or less, I'm golden, if it's greater, the request will fail
dt:test_article << set data type( "Numeric" );
dt << Transpose( columns( :test_article ), Output Table( "Transpose of test_article" ) );
dt = Data Table( "Transpose of test_article" );
Col_List = dt << Get Column Names( "String" );
For( i = 1, i <= N Items( Col_List ), i++,
If( Contains( Col_List[i], "Row" ),
Column( Col_List[i] ) << Set Selected( 1 )
)
);
dt << Combine Columns(
delimiter( "," ),
selected Columns only( 1 ),
Selected Columns are Indicator Columns( 0 ),
Column Name( "test_article" )
);
nc = N Cols( Data Table( "Transpose of test_article" ) );
Show( nc );
rowNum = 1;
col = Column( Data Table( "Transpose of test_article" ), "test_article" );
tableVal = col[rowNum];
adr0 = "http:/xyz:1234/oligos/more-oligo-info-intended?ids=";
address = adr0 || tableval;
request = New HTTP Request( URL( address ), Method( "GET" ), Timeout( 240 ) );
json1 = request << Send;
dt = JSON To Data Table( json1 );
Current Data Table() << set name( "test_article_info" );
Data Table( "test_article" ) << close window;
Data Table( "Transpose of test_article" ) << close window;
// I need to build a for loop that will send 1 request after the next and progressively concatenate those file together
Re : traitement par lots pour une requête httpMerci beaucoup! Je vais essayer d'adapter votre approche à mon problème.Re : traitement par lots pour une requête httpVoici une approche que j'utilise. Il utilise une seule instance de JMP. Le code combine les résultats HTTP en un seul objet JSON qui est ensuite converti en table de données.
list = {};
For( i = 1, i <= number_of_iterations, i++,
request = HTTP Request(
Url( url ),
Method( "GET" ),
Headers( request_headers ),
QueryString( query ),
Password( access_token ),
Timeout( 360 )
);
data = request << Send;
If( request << IsSuccess,
response = Parse JSON( data );
If( AndMZ( Is Associative Array( response ), Contains( response, "records" ), N Items( response["records"] ) > 0 ),
list ||= response["records"]
);
,
Wait( 0.25 )
);
);Re : traitement par lots pour une requête httpJ'avais une question concernant les requêtes http en arrière-plan qui @Craige_Hales répondit.
Demande d'arrière-plan Http
https://community.jmp.com/t5/Uncharted/Can-JMP-run-JMP/ba-p/283748#U283748
J'ai ensuite pris son code et l'ai modifié pour faire quelque chose comme ce que vous recherchez.Dans mon cas, j'interrogeais sur différentes dates, mais vous pouvez modifier le code pour qu'il boucle sur ce que vous voulez.Vous devrez probablement procéder à quelques ajustements en fonction de votre cas d'utilisation spécifique.
J'espère que cela aide.
url = "www....";
//Using this to generate different queries
query_keys = Associative Array();
query_keys["key1"] ="Bob"; //Or whatever your query parameters are
//I am looping over different dates
days_back = 20;
day_inc = 2;
start = Date Increment(today(),"day",-days_back);
end = Today();
cur_start = Date Increment(today(),"day",-day_inc);
cur_end = end;
index = 1;
//Here I am making files that contain the url and query key for each http request. I will use these later. This is only really needed if you intent to parallelize the http requset among multiple jmp instances.<BR />//If you don't want to parallelize the queries you can skip the writing to disk and just make a list of your query keys and/or urls.
while(cur_end>start,
query_key["startdate"] = char(Format(cur_start,"yyyy-mm-dd"));
query_key["enddate"] = char(Format(cur_end,"yyyy-mm-dd"));
Save Text File("$temp/url_file"||char(index)||".txt",url);
Save Text File("$temp/query_keys_file"||char(index)||".txt",As JSON Expr(query_keys));
index++;
if(Date Increment(cur_start,"day",-day_inc)>start,
cur_start = Date Increment(cur_start,"day",-day_inc),
cur_start = start;
);
cur_end = Date Increment(cur_end,"day",-day_inc);
);
index--;
nscripts = index;
njmp = 1; //You can parallelize this as much as you want by launching more jmp instances. Or if you want to
// a place to keep up with running instances
rp = [=> ];
rpIndex=0;
For( i = 1, i <= njmp, i += 1,
// build a custom JSL for each JMP to execute
workerFileName = Save Text File(
"$temp\deleteMe_RunsWhenLaunchedBeCareful" || Char( i ) || ".jsl",
"\[//!
deletefile("$temp/sentinel.txt");
for(i=1,i<=]\"||char(nscripts)||"\[,i++,
if(Is File("$temp/url_file"||char(i)||".txt"),
url = Load Text File( "$temp/url_file"||char(i)||".txt" ) ;
query_key = Parse JSON( Load Text File( "$temp/query_keys_file"||char(i)||".txt" ) );
Delete File("$temp/url_file"||char(i)||".txt");
Delete File("$temp/query_keys_file"||char(i)||".txt");<BR />//Using try so if one request fails I can keep moving through the requests
Try(
dig_http = New HTTP Request(URL(url),Method("Get"),Query String(query_key),Timeout(60*60*2))<<SEND></SEND>//My data is coming in as csv so I convert that to jmp.
file_name = "$temp/data"||char(i)||".csv";
Save Text File(file_name,dig_http);
dt = Open(file_name);
dt << Save("$temp/data"||char(i)||".jmp");
Delete File("$temp/data"||char(i)||".csv");
,<BR />//Dummy file if try fails
dt = New Table();
dt << Save("$temp/data"||char(i)||".jmp");
);
);
);
exit();
]\"
);
// don't launch another copy until the previous copy is running.
// JMP will become unhappy if the preferences file is busy in another
// copy of JMP. The sentinel will be deleted when JMP starts
savetextfile("$temp/sentinel.txt","");
rp[rpIndex+=1] = Run Program( executable( "jmp" ), options( {workerFileName} ) );
write("\!n",i," started...");
// wait for the sentinel to vanish
while(fileexists("$temp/sentinel.txt"),
wait(1);// don't burn the CPU while waiting
);
write("ok");
);
// many queries are probably still queued, wait for them to finish
scripts_left = nscripts;
While( scripts_left,
scripts_left = 0;
For( i = 1, i <= nscripts, i++,
If(Is File("$temp/url_file"||char(i)||".txt"),
scripts_left += 1; // count the ones still alive
)
);
write("\!n",scripts_left," http requests left");
wait(1); // don't burn the CPU while waiting
);
Write( "\!ngathering results..." );
dt = New table("Final Table");
For( i = 1, i <= nscripts, i += 1,
filename="$temp/data"||char(i)||".jmp";
// do something with the results
// clean up the temp files
tmp_dt = open(filename);
dt << Concatenate(tmp_dt,Append to First Table);
Close(tmp_dt);
deletefile(filename);
deletefile("$temp\deleteMe_RunsWhenLaunchedBeCareful" || Char( i ) || ".jsl");
);
Write( "\!ndone" );