検索

Announcement
· Nov 9

InterSystems 2025开发者创意大赛:让梦想落地

Hi开发者们!

鉴于去年首届大赛取得了巨大成功,我们决定再次举办这一赛事:

🏆InterSystems 2025开发者创意大赛:让梦想落地

您可以提交一个应用程序,实现InterSystems 创意门户中的创意,该创意应于本公告发布之前创建,其状态应为 Community Opportunity(社区共建机遇)Future Consideration(待研功能提案),您需要进行实际编程 😉

时间美国东部时间,2025 年 11 月 17 日至 12 月 7 日活动将延长至2025年12月14日! (项目提交时间延长至12月7日)

奖金12,000 美元

 

主题

在本次竞赛中,我们希望参赛者能够实现 InterSystems 创意门户网站中任意创建于本公告发布之前(美国东部时间2025年11月7日之前)、状态为Community Opportunity(社区共建机遇)Future Consideration(待研功能提案)的优秀创意。

基本要求:

  1. 应用程序或库必须功能完整且原创。不得简单导入或直接调用其他语言的现有库(C++除外,为IRIS创建接口需投入大量工作)。不得复制现有项目,不得包含任何专有代码。不得使用 InterSystems 或任何其他公司产品的逆向工程成果。请阅读我们的使用条款
  2. 只接受全新应用程序
  3. 该应用程序应在IRIS Community Edition 或 IRIS for Health Community Edition上运行。两者均可从 Evaluation site 下载主机(Mac、Windows)版本,或从InterSystems Container Registry 或 Community Containers 中拉取容器版:intersystemsdc/iris-community:latest 或 intersystemsdc/irishealth-community:latest
  4. 应用程序需为开源项目,并发布在GitHub或GitLab上。
  5. 应用程序的README文件需为英文,包含安装步骤,以及视频演示或/和应用工作原理的描述。
  6. 每位开发者最多提交三个作品。
  7. 可接受不同程序员/团队为实现同一想法而提交的不同应用程序。

注意。我们的专家将根据复杂性和实用性标准,对应用程序是否获准参赛拥有最终决定权。他们的决定为最终决定,不得上诉。

奖项设置

1. 专家提名奖(Experts Nomination)——获奖者由我们特别挑选的专家团选出:

🥇第一名 - 5,000 美元

🥈第二名 - 2,500 美元

🥉第三名 - 1,000 美元

🏅第四名 - 500 美元

🏅第五名 - 300 美元

🌟第 6-10 名 - 100 美元

2. 社区提名奖(Community Nomination)—— 获得总票数最多的应用程序:

🥇第一名 - 1,000 美元

🥈第二名 - 600 美元

🥉第三名 - 300 美元

🏅第四名 - 200 美元

🏅第五名 - 100 美元

❗ 若多名参赛者获得相同票数,则均视为获奖者,奖金由获奖者平分。
❗ 奖金仅发放给能验证身份的获奖者。如有疑问,组织方将联系参赛者要求提供额外信息。

谁可以参加?

开发者社区成员均可参加,InterSystems内部员工除外(InterSystems contractor员工可以参加)。还没有账号?现在来建一个!       

👥开发人员可以组队创建协作应用程序。一个团队允许 2 到 5 名开发人员。

请注意,要在您的README文件中标注您的团队成员(社区用户主页)。

重要截止日期:

🛠 应用程序开发和注册阶段:

  • 美国东部时间 2025 年 11 月 17 日(00:00):竞赛开始。
  • 美国东部时间 2025 年 12 月 7 日(23:59):提交截止日期。

投票阶段:

  • 美国东部时间 2025 年 12 月 8 日 (00:00):投票开始。
  • 美国东部时间 2025 年 12 月 14 日(23:59):投票结束。

注:在整个参赛期间(开发与投票期间),开发者可持续改进其应用程序

资源助力

✓ 示例应用程序:

✓ 我们建议从以下模板开始:

✓ 适用于 IRIS 和 Python 初学者:

✓ 面向使用 IRIS 和 ObjectScript 的初学者:

✓ 面向使用ObjectScript Package Manager (IPM) 的初学者:

✓ 如何向竞赛提交应用程序:

需要帮助?

加入 InterSystemsDiscord 服务器的竞赛频道,或在本帖评论区与我们交流。

我们迫不及待地想看到您的项目!祝好运 👍


参加本次竞赛即表示您同意此处列出的竞赛条款。请在参赛前仔细阅读这些条款。

 
Discussion (0)1
Log in or sign up to continue
Announcement
· Nov 9

Key Questions of the Month: October 2025

Hey Community,

It's time for the new batch of #KeyQuestions from the previous month.

120+ Deepest Questions That Make You Think Profoundly | 2025 Reveals -  AhaSlides

Here are the Key Questions of October chosen by InterSystems Experts within all Communities:

📌 ¿Cómo procesar ficheros en EnsLib.RecordMap.Service.FTPService files uno a uno? by @Kurro Lopez (ES)

📌 *.inc file For loop by @Michael Akselrod (EN)

📌 Can we save Message Viewer Query output to file (eg CSV) by @Colin Brough (EN)

These questions will be highlighted with the #Key Question tag, and their authors will get the Key Question badge on Global Masters.

If you find the key question(s) from other communities interesting, just drop us a line in the comments, and we will translate the question(s) and the accepted answer(s).

Congrats, and thank you all for your interesting questions. Keep them coming!

See you next month😉

Discussion (0)2
Log in or sign up to continue
Article
· Nov 9 3m read

Consuming REST-APIs for dummies (beginner-friendly)

As a developer who uses Cache as DB for a couple of projects, I'm using REST API's every time, knowing how to consume a resource from REST API, in my opinion, it's crucial to know how to consume external REST Api's using %Net.HttpRequest because it enables integration with modern web applications and services, and it's a crucial skill for a backend developer who loves and uses Cache as a DB.

What and who is %Net.HttpRequest

its just a class but this is the proper way of making request outside of the framework, this is just a simple class who provide HTTP methods like GET, POST and PUT and all others request methods, let you "play" with the headers and craft the request as you want to and how to handle the response you got, for every request send using %Net.HttpRequest, we got in return a %Net.HttpResponse object that contains the response in the same pattern.

A proper way to handle REST Api requests with %Net involves checking both the %Status returned value and the response status codes, which let you raise specific error messages and filter the responses when the request fails. The recommended way is to use macros like $$$ISER() or $SYSTEM.Status.IsOK(), we can use $SYSTEM.Status.DisplayError() to inspect the HTTP status code for handling.

Before we get our hands dirty, we should know who JSONPlaceHolder is, so from the official site, they said:

"Free fake and reliable API for testing and prototyping" 

And it is what it is, it's a free online REST API to play with, it's fake data, and we can even POST data to it, but this guide is all about consuming data, so let's focus on that, and this is a simple example of how to consume a JSON from a REST API Service:

Set request = ##class(%Net.HttpRequest).%New()
Set request.Server = "jsonplaceholder.typicode.com"
Set status = request.Get("/posts/1")

If $$$ISERR(status) {
    Do $SYSTEM.Status.DisplayError(status)
    Quit
}

Set response = request.HttpResponse
Set httpStatus = response.StatusCode
Set body = response.Data.Read()

If httpStatus < 200 || httpStatus >= 300 {
    Write "HTTP Error: ", response.StatusLine, !
    Quit
}

Write "HTTP Status: ", response.StatusLine, !
// Do what ever you want with it!

What do we do?

  1. Assign "request" from a new instance of %New.HttpRequest object
  2. Assign a location/address to the property Server on the request instance.
  3. Making a GET request to the endpoint we provided to the function "/posts/1", which means we request data from "posts" with id equal to 1 (to get just the first message, we can specify just "posts" and get all of them, it's good to play with it)
  4. Check if there is any error in the function using $$$ISERR with the status returned from the request GET method. If there is none, the request was sent successfully from our endpoint.
  5. Assign the response variable from the request object itself.
  6. Extract the status and the body.
  7. Check if the response code is OK If the code returned is above 200 and below or equal to 300, it's OK. (307 is redirecting, so it's less what we need here)

So, in a general perspective, what are we doing here?

  1. Craft a pre-defined request using the class
  2. trying to consume the data we needed
  3. Handle both use cases of failure and success

If everything goes well, you should get something like this as a JSON object:

And this is how we consume data from a REST API, but what can we do with it?
Let's see how to extract the data from the response:

Set reponseBodyAsJSON = {}.%FromJSON(body)

Write "id: ", reponseBodyAsJSON.id, !
Write "title: ", reponseBodyAsJSON.title, !
Write "body: ", reponseBodyAsJSON.body, !

In this way, we break the response into key-value pairs like JSON should be.
This is how we can easily access and consume a REST API resource using the GET method and %Net.HttpRequest class, this is a really beginner-friendly guide that lets you "overview" how we do it.

Learning the magic of REST APIs is your duty.

Since this topic is very approachable, you can easily experiment by making requests and trying out different methods. In the next guide, we’ll look at how to securely transfer data between two REST-based services.

Discussion (0)1
Log in or sign up to continue
Announcement
· Nov 8

Videos for InterSystems Developers, October 2025 Recap

Hello and welcome to the October 2025 Developer Community YouTube Recap.
InterSystems Ready 2025
By Don Woodlock, Sean Kennedy, Alex MacLeod, Erica Song, James Derrickson, Julie Smith, Kristen Nemes, Varun Saxena, Dimitri Fane, Jonathan Teich, Judy Charamand
By Thomas McCoy
By John Paladino, Mike Brand, Mike Fuller, Peter Cutts
By Stefan Wittmann, Raj Singh
 
"Code to Care" videos
Before the Lightbulb: Understanding the First Phase of the AI Revolution in Medicine
By Don Woodlock, Head of Global Healthcare Solutions, InterSystems
More from InterSystems Developers
How Technology Communities Drive Professional Careers
By Rochael Ribeiro Filho, Guido Orlando Jr
Foreign Tables In 2025.2
By Michael Golden
Discussion (0)1
Log in or sign up to continue
Article
· Nov 8 4m read

How to run a process on an interval or schedule?

When I started my journey with InterSystems IRIS, especially in Interoperability, one of the initial and common questions I had was: how can I run something on an interval or schedule? In this topic, I want to share two simple classes that address this issue. I'm surprised that some similar classes are not located somewhere in EnsLib. Or maybe I didn't search well? Anyway, this topic is not meant to be complex work, just a couple of snippets for beginners.

So let's assume we have a task "Take some data from an API and put it into an external database". To solve this task, we need:

  1. Ens.BusinessProcess, which contains an algorithm of our data flow: How to prepare a request for taking data, how to transform the API response to a request for DB, how to handle errors and other events through the data flow lifecycle
  2. EnsLib.REST.Operation for making HTTP requests to the API using EnsLib.HTTP.OutboundAdapter
  3. Ens.BusinessOperation with EnsLib.SQL.OutboundAdapter for putting data into the external database via a JDBC connection

Details of the implementation of these business hosts lie outside the scope of this article, so let's say we already have a process and two operations. But how to run it all? The process can run only by inbound request... We need an Initiator! Which one will just be run by interval and send a dummy request to our process.

Here is such an initiator class. I added a bit of additional functionality: sync or async calls will be used, and stop or not process on error if we have many hosts as targets. But mainly here it's a target list. To each item (business host) on this list will be sent a request. Pay attention to the OnGetConnections event - it's needed for correct link building in Production UI.

/// Call targets by interval
Class Util.Service.IntervalCall Extends Ens.BusinessService
{

/// List of targets to call
Property TargetConfigNames As Ens.DataType.ConfigName;

/// If true, calls are made asynchronously (SendRequestAsync)
Property AsyncCall As %Boolean;

/// If true, and the target list contains more than one target, the process will stop after the first error
Property BreakOnError As %Boolean [ InitialExpression = 1 ];

Property Adapter As Ens.InboundAdapter;

Parameter ADAPTER = "Ens.InboundAdapter";

Parameter SETTINGS = "TargetConfigNames:Basic:selector?multiSelect=1&context={Ens.ContextSearch/ProductionItems?targets=1&productionName=@productionId},AsyncCall,BreakOnError";

Method OnProcessInput(pInput As %RegisteredObject, Output pOutput As %RegisteredObject, ByRef pHint As %String) As %Status
{
    Set tSC = $$$OK
    Set targets = $LISTFROMSTRING(..TargetConfigNames)

    Quit:$LISTLENGTH(targets)=0 $$$ERROR($$$GeneralError, "TargetConfigNames are not defined")

    For i=1:1:$LISTLENGTH(targets) {
        Set target = $LISTGET(targets, i)
        Set pRequest = ##class(Ens.Request).%New()

        If ..AsyncCall {
            Set tSC = ..SendRequestAsync(target, pRequest)
        } Else  {
            Set tSC = ..SendRequestSync(target, pRequest, .pResponse)
        }
        Quit:($$$ISERR(tSC)&&..BreakOnError)
    }

    Quit tSC
}

ClassMethod OnGetConnections(Output pArray As %String, pItem As Ens.Config.Item)
{
    If pItem.GetModifiedSetting("TargetConfigNames", .tValue) {
        Set targets = $LISTFROMSTRING(tValue)
        For i=1:1:$LISTLENGTH(targets) Set pArray($LISTGET(targets, i)) = ""
    }
}

}

After it, you just need to add this class to Production, and mark our business process in the TargetConfigNames setting. 

But what if requirements were changed? And now we need to run our data grabber every Monday at 08:00 AM. The best way for it is using Task Manager. For this, we need to create a custom task that will run our Initiator programmatically. Here is a simple code for this task:

/// Launch selected business service on schedule
Class Util.Task.ScheduleCall Extends %SYS.Task.Definition
{

Parameter TaskName = "Launch On Schedule";

/// Business Service to launch
Property ServiceName As Ens.DataType.ConfigName;

Method OnTask() As %Status
{
    #dim tService As Ens.BusinessService
    Set tSC = ##class(Ens.Director).CreateBusinessService(..ServiceName, .tService)
    Quit:$$$ISERR(tSC) tSC
    
    Set pRequest = ##class(Ens.Request).%New()
    Quit tService.ProcessInput(pRequest, .pResponse)
}

}

Two important things here:

  • You must set the Pool Size of the Initiator Business Service to 0 to prevent running it by call interval (option Call Interval, you can clear or leave as is - it's not used when Pool Size is 0)

             

  • You need to create a task in Task Manager, choose "Launch On Schedule" as task type (don't forget to check a Namespace), set our Initiator Business Service name to the ServiceName parameter, and set up the desired schedule. See: System Operation > Task Manager > New Task

And a bonus

I often faced cases when we need to run something in Production only on demand. Of course, we can create some custom UI on CSP for it, but reinventing the wheel is not our way. I believe it is better to use the typical UI of the Management Portal. So, the same task that we created previously can be run manually. Just change the task run type to On Demand for it. On-demand task list is available at System > Task Manager > On-demand Tasks, see the Run button. Furthermore, the Run button (manual run) is available for any kind of task.

It is all. Now we have a pretty architecture of interoperability for our business hosts. And 3 ways to run our data grabber: by interval, on a timetable, or manually.

Discussion (0)1
Log in or sign up to continue