如何在 azure 函数中使用 rss 文件

how to work with rss file in azure function

我有带 http 触发器的 azure 函数,可以从外部源获取数据。 在我用这些外部数据创建 RSS 文件的函数中。

我想在收到新数据时更新此文件(在此状态下它会删除以前的数据)。

此外,我想知道如何获取此 RSS 文件的 url 以便在逻辑应用程序中使用它。

任何想法都会得到认可。

函数 class 看起来像这样:

public class Function {

private HashMap<String, String> crntNewItemList = new HashMap<>();

@FunctionName("HttpAddFeedItem")
public HttpResponseMessage run(
        @HttpTrigger(name = "req", methods = {HttpMethod.GET, HttpMethod.POST}, authLevel = AuthorizationLevel.ANONYMOUS) HttpRequestMessage<Optional<String>> request,
        final ExecutionContext context) {
    context.getLogger().info("Java HTTP trigger processed a request.");

    // Parse query parameter
    String body = request.getBody().get(); // Get request body

    if (body == null) {
        return request.createResponseBuilder(HttpStatus.BAD_REQUEST).body("Please pass a name on the query string or in the request body").build();
    } else {
        String contentType = request.getHeaders().get("content-type");

        initNewsItemList(contentType, body);

        String copyright = "Copyright hold by XXX";
        String title = "Eclipse and Java Information";
        String description = "Eclipse and Java Information";
        String language = "en";
        String link = "httXX://XXw.XXX.com/";
        Calendar cal = new GregorianCalendar();
        Date creationDate = cal.getTime();
        SimpleDateFormat date_format = new SimpleDateFormat(
                "EEE', 'dd' 'MMM' 'yyyy' 'HH:mm:ss' 'Z", Locale.US);
        String pubdate = date_format.format(creationDate);
        Feed rssFeeder = new Feed(title, link, description, language,
                copyright, pubdate);

        // now add one example entry
        FeedMessage feed = new FeedMessage();
        feed.setTitle(crntNewItemList.get("title"));
        feed.setDescription(crntNewItemList.get("description"));
        feed.setAuthor("nonsense@somewhere.de (XXX)");
        feed.setGuid("htXXs://XXw.XXX.com/tutorials/RSSFeed/article.html");
        feed.setLink(crntNewItemList.get("link"));
        rssFeeder.getMessages().add(feed);

        // now write the file
        RSSFeedWriter writer = new RSSFeedWriter(rssFeeder, "articles.rss");
        try {
            writer.write();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return request.createResponseBuilder(HttpStatus.OK).body("success").build();
    }
}

****更新****
RSSFeedWriter class 是:

public class RSSFeedWriter {

    private String outputFile;
    private Feed rssfeed;

    public RSSFeedWriter(Feed rssfeed, String outputFile) {
        this.rssfeed = rssfeed;
        this.outputFile = outputFile;
    }

    public void write() throws Exception {

        // create a XMLOutputFactory
        XMLOutputFactory outputFactory = XMLOutputFactory.newInstance();

        // create XMLEventWriter
        XMLEventWriter eventWriter = outputFactory
                .createXMLEventWriter(new FileOutputStream(outputFile));

        // create a EventFactory

        XMLEventFactory eventFactory = XMLEventFactory.newInstance();
        XMLEvent end = eventFactory.createDTD("\n");

        // create and write Start Tag

        StartDocument startDocument = eventFactory.createStartDocument();

        eventWriter.add(startDocument);

        // create open tag
        eventWriter.add(end);

        StartElement rssStart = eventFactory.createStartElement("", "", "rss");
        eventWriter.add(rssStart);
        eventWriter.add(eventFactory.createAttribute("version", "2.0"));
        eventWriter.add(end);

        eventWriter.add(eventFactory.createStartElement("", "", "channel"));
        eventWriter.add(end);

        // Write the different nodes

        createNode(eventWriter, "title", rssfeed.getTitle());

        createNode(eventWriter, "link", rssfeed.getLink());

        createNode(eventWriter, "description", rssfeed.getDescription());

        createNode(eventWriter, "language", rssfeed.getLanguage());

        createNode(eventWriter, "copyright", rssfeed.getCopyright());

        createNode(eventWriter, "pubdate", rssfeed.getPubDate());

        for (FeedMessage entry : rssfeed.getMessages()) {
            eventWriter.add(eventFactory.createStartElement("", "", "item"));
            eventWriter.add(end);
            createNode(eventWriter, "title", entry.getTitle());
            createNode(eventWriter, "description", entry.getDescription());
            createNode(eventWriter, "link", entry.getLink());
            createNode(eventWriter, "author", entry.getAuthor());
            createNode(eventWriter, "guid", entry.getGuid());
            eventWriter.add(end);
            eventWriter.add(eventFactory.createEndElement("", "", "item"));
            eventWriter.add(end);

        }

        eventWriter.add(end);
        eventWriter.add(eventFactory.createEndElement("", "", "channel"));
        eventWriter.add(end);
        eventWriter.add(eventFactory.createEndElement("", "", "rss"));

        eventWriter.add(end);

        eventWriter.add(eventFactory.createEndDocument());

        eventWriter.close();
    }

    private void createNode(XMLEventWriter eventWriter, String name,

                            String value) throws XMLStreamException {
        XMLEventFactory eventFactory = XMLEventFactory.newInstance();
        XMLEvent end = eventFactory.createDTD("\n");
        XMLEvent tab = eventFactory.createDTD("\t");
        // create Start node
        StartElement sElement = eventFactory.createStartElement("", "", name);
        eventWriter.add(tab);
        eventWriter.add(sElement);
        // create Content
        Characters characters = eventFactory.createCharacters(value);
        eventWriter.add(characters);
        // create End node
        EndElement eElement = eventFactory.createEndElement("", "", name);
        eventWriter.add(eElement);
        eventWriter.add(end);
    }
}

关于这个问题,我建议您创建rss 文件并将该文件上传到Azure blob。在Azure逻辑应用中,我们可以使用Azure Blob Storage Connector来处理rss文件。

更多详情请参考以下步骤

  1. 安装 Azure blob 存储 SDK
 <dependency>
            <groupId>com.microsoft.azure</groupId>
            <artifactId>azure-storage</artifactId>
            <version>8.4.0</version>
        </dependency>
  1. 更新 RSSFeedWriter class
public class RSSFeedWriter {
    private String outputFile; // the file name
    private Feed rssfeed;
    private String connectionString; // the storage account connection string

    public RSSFeedWriter(Feed rssfeed, String outputFile) {
        this.rssfeed = rssfeed;
        this.outputFile = outputFile;
    }
    public RSSFeedWriter(Feed rssfeed, String outputFile,String connectionString) {
        this.rssfeed = rssfeed;
        this.outputFile = outputFile;
        this.connectionString=connectionString;
    }
    public void write() throws Exception {

        CloudStorageAccount storageAccount = CloudStorageAccount.parse(connectionString);
        CloudBlobClient blobClient = storageAccount.createCloudBlobClient();
        CloudBlobContainer container = blobClient.getContainerReference("test");
        CloudBlockBlob blob =container.getBlockBlobReference("test.rss");
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
         // create a XMLOutputFactory
        XMLOutputFactory outputFactory = XMLOutputFactory.newInstance();

        // create XMLEventWriter
        XMLEventWriter eventWriter = outputFactory
                .createXMLEventWriter(outputStream);
        // create rss 
        ...

        // upload rss to Azure blob
        blob.upload(new ByteArrayInputStream(outputStream.toByteArray()),outputStream.toByteArray().length);
        outputStream.close();
    }

    private void createNode(XMLEventWriter eventWriter, String name,

                            String value) throws XMLStreamException {
        XMLEventFactory eventFactory = XMLEventFactory.newInstance();
        XMLEvent end = eventFactory.createDTD("\n");
        XMLEvent tab = eventFactory.createDTD("\t");
        // create Start node
        StartElement sElement = eventFactory.createStartElement("", "", name);
        eventWriter.add(tab);
        eventWriter.add(sElement);
        // create Content
        Characters characters = eventFactory.createCharacters(value);
        eventWriter.add(characters);
        // create End node
        EndElement eElement = eventFactory.createEndElement("", "", name);
        eventWriter.add(eElement);
        eventWriter.add(end);
    }

}
  1. 更新函数代码
@FunctionName("HttpAddFeedItem")
public HttpResponseMessage run(
        @HttpTrigger(name = "req", methods = {HttpMethod.GET, HttpMethod.POST}, authLevel = AuthorizationLevel.ANONYMOUS) HttpRequestMessage<Optional<String>> request,
        final ExecutionContext context) {
    context.getLogger().info("Java HTTP trigger processed a request.");

 ...

// get the storage account connection string you store in app settings or local.settings.json with the key name
String connectionString = System.getenv("AzureWebJobsStorage"); 
        String outputFile=""; // the file name
        RSSFeedWriter writer = new RSSFeedWriter(rssFeeder, outputFile,connectionString);
        try {
            writer.write();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return request.createResponseBuilder(HttpStatus.OK).body("success").build();
    }
}

更新

如果想直接在浏览器中通过blobURL访问rss文件,请参考以下步骤

  1. 请将容器 public 访问级别设置为 Public read access for blobs only。详情请参考document

  2. 请确保 blob 的内容类型正确。 rss 文件的内容类型可以是 application/rss+xml。关于如何更改内容类型,请参考以下代码

 CloudStorageAccount storageAccount = CloudStorageAccount.parse(Constr)
CloudBlobClient blobClient = storageAccount.createCloudBlobClient();
        CloudBlobContainer container = blobClient.getContainerReference("test");
        if(!container.exists()){
            container.create();

        }
 CloudBlockBlob blob =container.getBlockBlobReference("test.rss");
 blob.getProperties().setContentType("application/rss+xml");

        blob.uploadProperties();

之后,我们就可以在浏览器中访问file