It's all about the answers!

Ask a question

Downloading an attachment from RTC workitem via REST using Python


Yogesh Ranjitkar (152) | asked Sep 16 '21, 1:40 a.m.
edited Sep 16 '21, 1:42 a.m.

Hi All,

I am trying to download an attachment of workitem via REST using python. However, I haven't been able to locate any useful APIs to do so. I found the JAVA API that does the download but is there any REST Api I can use in my python code. I tried with python module called rtcclient but it didn't work for me.
Thanks in advance.

Accepted answer


permanent link
Ian Barnard (1.2k613) | answered Sep 22 '21, 8:39 a.m.
JAZZ DEVELOPER

Hi Yogesh


It is possible to download attachments although TBH I'm not sure if this is formally part of the "OSLC" API, but the steps below do require the header OSLC-Core-Version: 2.0 to work.

Steps:

1. Using perhaps OSLC Query, retrieve the workitem URI e.g. https://jazz.ibm.com:9443/ccm/resource/itemName/com.ibm.team.workitem.WorkItem/38

2. GET from that URI with headers OSLC-Core-Version: 2.0 and Accept: application/rdf+xml
In the returned RDF, for each attachment there is a property like:
    <rtc_cm:com.ibm.team.workitem.linktype.attachment.attachment rdf:ID="n6" rdf:resource="https://jazz.ibm.com:9443/ccm/resource/itemOid/com.ibm.team.workitem.Attachment/_IZszcRuREeyjc_YwJfTLJA"/>

3. GET from URI in the rtc_cm:com.ibm.team.workitem.linktype.attachment.attachment tag using the same headers, this gives you the name of the attachment in a dcterms:title tag and a link to its content in a tag rtc_cm:content e.g.:

<?xml version="1.0" encoding="UTF-8"?>
<rdf:RDF
  xmlns:dcterms="http://purl.org/dc/terms/"
    <dcterms:creator rdf:resource="https://jazz.ibm.com:9443/jts/users/ibm"/>
    <rtc_cm:contentLength rdf:datatype="http://www.w3.org/2001/XMLSchema#long">1923</rtc_cm:contentLength>
    <rtc_cm:modifiedBy rdf:resource="https://jazz.ibm.com:9443/jts/users/ibm"/>
    <dcterms:description rdf:parseType="Literal">buildexe.bat</dcterms:description>
  </rtc_cm:Attachment>
</rdf:RDF>

4. GET from that rtc_cm:content URI using the OSLC-Core-Version: 2.0 header and with the Referer header set to the URI, and you'll get the (binary) content

5. Save to the file named from the dcterms:title name

All this can be done using Python; I use the Requests package using a requests session with ElementTree or lxml to handle XML and it works admirably :-)

HTH
Ian

Yogesh Ranjitkar selected this answer as the correct answer

Comments
Ralph Schoon commented Sep 22 '21, 9:13 a.m.
FORUM ADMINISTRATOR / FORUM MODERATOR / JAZZ DEVELOPER

Nice. Thanks for looking into it. 


Yogesh Ranjitkar commented Sep 22 '21, 6:52 p.m.

Hi Ian Barnard,

Thanks for the reply. I have got this thing working and the process you mentioned was exactly what I did in my script as well. It works perfectly.. Thanks again.

-Yogesh

2 other answers



permanent link
Ralph Schoon (60.5k33643) | answered Sep 16 '21, 3:11 a.m.
FORUM ADMINISTRATOR / FORUM MODERATOR / JAZZ DEVELOPER
This question has been asked here several times and answered several times.

To my knowledge the answer is that there is no supported REST API to download work item attachments.

The Java API you found is supported. There is no other API. I know that others have reverse engineered the API used by the Web client. This is possible but not supported. It is also not a REST API as far as I know.

Comments
Yogesh Ranjitkar commented Sep 16 '21, 6:45 p.m. | edited Sep 16 '21, 6:49 p.m.

Hi Ralph,


Thanks for your response. So does that mean there is no python way to achieve it. Can I use OSLC approach in python. Not sure though if that helps


Ralph Schoon commented Sep 17 '21, 2:13 a.m. | edited Sep 17 '21, 8:40 a.m.
FORUM ADMINISTRATOR / FORUM MODERATOR / JAZZ DEVELOPER

I am unsure what is left open in the answer, but ok.


I am not a Python hero, but I would assume you can call an application e.g. based on the RTC Plain Java Client Libraries in Python. So you could use the Java API and develop a tool like https://rsjazz.wordpress.com/2012/09/21/downloading-attachments-from-work-items/ and use that. Then you would have a way to download attachments in Python, just not using OLSC.

Unrelated to the question, yes, it is possible to use OSLC APIS in Python (use the requests library). 

But as there is no OSLC support for downloading attachments, you can't solve that specific task you ask about with OSLC. Not in Python, not in any other language or tool that could be used to create REST/OSLC calls.  


permanent link
manh manhquynh (11) | answered Sep 28 '21, 3:03 a.m.

 I also need the same material as you. Hope everybody help please

Your answer


Register or to post your answer.