Как использовать атомный клиент Abdera для отправки содержимого и вложений

Мы используем Abdera для взаимодействия с API IBM Connections, но наша проблема в основном связана с самой Abdera.

Я думаю, что в Abdera есть ошибка, которая не позволяет вам отправлять Записи, содержащие контент и вложения в одном запросе. В качестве обходного пути вы, вероятно, сможете отправить два отдельных запроса для создания сначала с контентом, а затем обновить с вложением. К сожалению, API-интерфейс Connections потребовал, чтобы все данные содержались в одном запросе, или ваши старые данные не сохраняются.

Следующий код показывает созданную запись Abdera:

ClassLoader classloader = Thread.currentThread().getContextClassLoader();
InputStream is = classloader.getResourceAsStream("google-trends.tiff");

final Abdera abdera = new Abdera();
Entry entry = abdera.getFactory().newEntry();
entry.setTitle("THIS IS THE TITLE");
entry.setContentAsHtml("<p>CONTENT AS HTML</p>");
entry.setPublished(new Date());

Category category = abdera.getFactory().newCategory();
category.setLabel("Entry");
category.setScheme("http://www.ibm.com/xmlns/prod/sn/type");
category.setTerm("entry");
entry.addCategory(category);

RequestEntity request =
    new MultipartRelatedRequestEntity(entry, is, "image/jpg",
        "asdfasdfasdf");

Когда MultipartRelatedRequestEntity создается, создается NullPointer:

java.lang.NullPointerException
    at
org.apache.abdera.protocol.client.util.MultipartRelatedRequestEntity.writeInput(MultipartRelatedRequestEntity.java:74)

Это происходит потому, что он ожидает элемент содержимого "src", но после поиска в исходном коде Abdera кажется, что это не обязательный элемент согласно спецификации. Это похоже на ошибку в коде Abdera, нет?

/**
 * <p>
 * RFC4287: atom:content MAY have a "src" attribute, whose value MUST be an IRI reference. If the "src" attribute is
 * present, atom:content MUST be empty. Atom Processors MAY use the IRI to retrieve the content and MAY choose to
 * ignore remote content or to present it in a different manner than local content.
 * </p>
 * <p>
 * If the "src" attribute is present, the "type" attribute SHOULD be provided and MUST be a MIME media type, rather
 * than "text", "html", or "xhtml".
 * </p>
 * 
 * @param src The IRI to use as the src attribute value for the content
 * @throws IRISyntaxException if the src value is malformed
 */

Чтобы показать это, я установил соединение с эталонным приложением к IBM Greenhouse Connections, но также включил два модульных теста, в которых нулевой указатель можно тестировать без подключения. Это можно найти на GitHub

1 ответ

Решение

Можно настроить его на работу с Abdera, для дальнейшего использования здесь приведен пример размещения записи, содержащей текстовое содержимое, а также одно (или несколько) вложений. Вам необходимо использовать часть базовой структуры HttpClient:

  final Entry entry = this.createActivityEntry();
  final RequestOptions options = this.client.getDefaultRequestOptions();
  options.setHeader("Content-Type", "multipart/related;type=\"application/atom+xml\"");

  StringPart entryPart = new StringPart("entry", entry.toString());
  entryPart.setContentType("application/atom+xml");

  FilePart filePart = new FilePart("file", new File(resource.getFile()));           

  RequestEntity request = new MultipartRequestEntity(new Part[] { entryPart, filePart}, this.client.getHttpClientParams());
  ClientResponse response = client.post(this.url + this.activityId, request, options);

Это позволило нам создать запись активности IBM Connections с содержимым и вложениями в одном запросе, поскольку это требуется API.

Другие вопросы по тегам