【问题标题】:how to work with rss file in azure function如何在 azure 函数中使用 rss 文件
【发布时间】:2020-04-01 17:06:01
【问题描述】:

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

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

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

任何想法都会被采纳。

Function 类如下所示:

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 类是:

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);
    }
}

【问题讨论】:

  • 请问您使用哪个 sdk 来创建 RSS 文件?
  • 我遵循这个vogella.com/tutorials/RSSFeed/article.html 指南。我更新了问题并分享了班级如何创建 rss 文件。
  • 您还有其他顾虑吗?如果您没有其他顾虑,可以请accept the answer吗?它可能会帮助更多的人。
  • @JimXu 抱歉耽搁了。实际上这无济于事,因为保存在 azure 存储中的文件的 url 无法在浏览器中打开,当我使用带有 rss 连接器的逻辑应用程序并将该文件的 url 放入时没有任何反应。
  • 如果要使用 URL 直接访问 Azure blob 中的文件。您可以更改 Azure blob 访问级别:docs.microsoft.com/en-us/azure/storage/blobs/…

标签: java azure rss azure-functions


【解决方案1】:

关于这个问题,我建议您创建 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 类
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();
    }
}

更新

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

  1. 请将容器公共访问级别设置为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

【讨论】:

  • 我仍然不知道为什么,但我得到错误:Failed to load resource: the server responded with a status of 400 (One of the request inputs is out of range.) url 是:f33e9cb10aaf409fb455.blob.core.windows.net/test/news.rss
  • 我知道这与字体大小有关。在你的照片中是 640 B。在我的情况下它是空的。你能告诉我你是怎么编辑的吗?
  • @YaffaHarari 你能告诉我什么时候出现错误吗?
  • 当我输入 url 时,我会在控制台浏览器获取它。 (在 F12 模式下)
猜你喜欢
  • 2018-03-07
  • 2021-12-18
  • 1970-01-01
  • 1970-01-01
  • 2022-11-07
  • 1970-01-01
  • 1970-01-01
  • 2019-03-23
  • 1970-01-01
相关资源
最近更新 更多