как работать с rss файлом в функции azure - PullRequest
0 голосов
/ 01 апреля 2020

У меня есть azure функции с http-триггером, которые получают данные из внешнего источника. внутри функций я создал файл RSS с этими внешними данными.

Я хочу обновить этот файл при получении новых данных (в этом состоянии он удаляет предыдущие данные).

Кроме того, я хочу знать, как я могу получить URL этого файла RSS для использования в приложении logi c.

любая идея будет одобрена. Класс функций выглядит следующим образом:

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

**** Update **** класс 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);
    }
}

1 Ответ

0 голосов
/ 03 апреля 2020

Что касается вопроса, я предлагаю вам создать файл rss и загрузить его в Azure blob. В приложении Azure logi c мы можем использовать Azure Соединитель хранилища BLOB-объектов для обработки файла rss.

Для получения дополнительной информации, пожалуйста, обратитесь к следующим шагам

  1. Установить Azure SDK для хранения больших двоичных объектов
 <dependency>
            <groupId>com.microsoft.azure</groupId>
            <artifactId>azure-storage</artifactId>
            <version>8.4.0</version>
        </dependency>
Обновление класса 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);
    }

}
update Код функции
@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();
    }
}

update

Если вы хотите получить прямой доступ к rss-файлу через URL-адрес BLOB-объекта в браузере, обратитесь к следующему шаги

  1. Пожалуйста, установите уровень доступа контейнера c как Public read access for blobs only. Для получения более подробной информации, пожалуйста, обратитесь к документу

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

После этого мы можем получить доступ к файлу в браузере enter image description here enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...