【发布时间】: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