2013-09-05 8 views
3

Я пытаюсь опубликовать приложение JARA с использованием новейшего API REST. Вот мой код:Добавить вложение в Jira через REST API

public boolean addAttachmentToIssue(String issueKey, String path){ 

     String auth = new 

String(org.apache.commons.codec.binary.Base64.encodeBase64((user+":"+pass).getBytes())); 


    Client client = Client.create(); 
    WebResource webResource = client.resource(baseURL+"issue/"+issueKey+"/attachments"); 


    FormDataMultiPart formDataMultiPart = new FormDataMultiPart(); 

     File f = new File(path); 
     if(f.exists() && f.isFile()){ 
      FileInputStream fis = null; 
      try { 
       fis = new FileInputStream(f); 
      } catch (FileNotFoundException e) { 
       return false; 
      } 

      ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
      byte[] buf = new byte[1024]; 
      try { 
       for (int readNum; (readNum = fis.read(buf)) != -1;) { 
        bos.write(buf, 0, readNum); //no doubt here is 0 
       } 
       fis.close(); 
       bos.close(); 
      } catch (IOException ex) { 
       try { 
        fis.close(); 
        bos.close(); 
       } catch (IOException e) { 
        return false; 
       } 
       return false; 
      } 
      byte[] bytes = bos.toByteArray(); 

      FormDataBodyPart bodyPart = new FormDataBodyPart("file", new ByteArrayInputStream(bytes), MediaType.APPLICATION_OCTET_STREAM_TYPE); 
      formDataMultiPart.bodyPart(bodyPart); 
    }else{ 
     return false; 
    } 

    ClientResponse response = null; 

    response = webResource.header("Authorization", "Basic " + auth).header("X-Atlassian-Token", "nocheck").type(MediaType.MULTIPART_FORM_DATA).accept("application/json").post(ClientResponse.class, formDataMultiPart); 
    System.out.println(response); 

    int statusCode = response.getStatus(); 
    System.out.println(statusCode); 
    String resp = response.getEntity(String.class); 
    System.out.println(resp); 

    return true; 
} 

Однако я получаю следующий ответ:

POST http://localhost:8082/rest/api/2/issue/TEST-2/attachments returned a response status of 404 Not Found 
404 
XSRF check failed 

проблема с ключом TEST-2 существует в моем локальном экземпляре JIRA и я могу добавить вложение «по вручную "в приложении Jira. Я знаю, что я должен добавить заголовок типа «X-Atlassian-Token: nocheck», чтобы предотвратить XSRF, но по результату я должен что-то делать неправильно. Что еще меня смущает, так это то, что 404 после проверки XSRF.

Я удалил google для ответов без успеха Может ли кто-нибудь угадать догадки о том, что я делаю неправильно?

+0

У меня это работает на Python, используя jira-python, но не в java. Является ли клиент Rest Rest Java на https://bitbucket.org/atlassian/jira-rest-java-client/src вообще помогите – mdoar

+0

Не совсем, я пробовал, но, учитывая, что у меня слишком много зависимостей в мой текущий проект, добавив больше причин некоторой путаницы в пути к классам. Моя единственная альтернатива, чтобы сделать сообщение самостоятельно –

ответ

3

мне удалось решить эту проблему с помощью клиента Apache HTTP Для кого может иметь один и тот же вопрос, вот код:

public boolean addAttachmentToIssue(String issueKey, String path){ 


     String auth = new String(org.apache.commons.codec.binary.Base64.encodeBase64((user+":"+pass).getBytes())); 


    HttpClient httpclient = new DefaultHttpClient(); 
    HttpPost httppost = new HttpPost(baseURL+"issue/"+issueKey+"/attachments"); 
    httppost.setHeader("X-Atlassian-Token", "nocheck"); 
    httppost.setHeader("Authorization", "Basic "+auth); 
    MultipartEntity entity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE); 

    File fileToUpload = new File(path); 
    FileBody fileBody = new FileBody(fileToUpload, "application/octet-stream"); 
    entity.addPart("file", fileBody); 

    httppost.setEntity(entity); 
    HttpResponse response = null; 
    try { 
     response = httpclient.execute(httppost); 
    } catch (ClientProtocolException e) { 
     return false; 
    } catch (IOException e) { 
     return false; 
    } 
    HttpEntity result = response.getEntity(); 

    if(response.getStatusLine().getStatusCode() == 200) 
     return true; 
    else 
     return false; 

} 
+1

Как передать путь вложения как URL-адрес? например: мой файл находится в https: //localhost/secure/thumbnail/23979/_thumb_23979.png. Как я могу отправить этот путь к файлу в этом коде? –

+0

Привет @KannanLg, какое решение вы использовали для передачи URL-адреса в качестве параметра отправки, чтобы добавить вложение? Могли ли вы загрузить файл в Интернете? Заранее спасибо. – jupi

1

@Nuno Нету, я удивлен, что ваш метод работает , поскольку в FileBody отсутствуют некоторые ключевые элементы. Возможно ли обновление API-интерфейса Confluence? Самое главное - комментарий файла и кодировка. Как бы то ни было, ваш пример бросит 500, но для новых людей, приходящих на это через Google, на самом деле работает код ниже.

Основное различие здесь будет:

FileBody fileBody = new FileBody(fileToUpload, fileComment, "application/octet-stream", "UTF-8"); 

Я также добавил небольшой кусочек логики для пустых комментариев файла.

/************************************************************************************************** 
/** 
* Confluence integration. This allows the user to attach captured images to confluence pages. 
* 
/**************************************************************************************************/ 
/** 
* 
* @param pageID {int} Page ID of the Confluence page to add to. Navigate to Confluence page, hit 'e', copy the ID from the URI. 
* @param {String} path 
* @param {String} user Your Confluence username. 
* @param {String} pass Your Confluence password. 
* @param {String} baseURL Your Confluence url. 
* @return {boolean} 
*/ 

public boolean addAttachmentToPage(int pageID, String path, String user, String pass, String baseURL, String fileComment){ 
    String auth = new String(org.apache.commons.codec.binary.Base64.encodeBase64((user+":"+pass).getBytes())); 

    if (fileComment.equals("") | fileComment.equals(" ") | fileComment.equals(null)){ 
     fileComment = user + "-" + path; 
    }; 

    HttpClient httpclient = new DefaultHttpClient(); 
    HttpPost httppost = new HttpPost(baseURL + "/rest/api/content/" + pageID + "/child/attachment"); 
    httppost.setHeader("X-Atlassian-Token", "nocheck"); 
    httppost.setHeader("Authorization", "Basic "+auth); 
    MultipartEntity entity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE); 

    File fileToUpload = new File(path); 
    FileBody fileBody = new FileBody(fileToUpload, fileComment, "application/octet-stream", "UTF-8"); 
    entity.addPart("file", fileBody); 

    httppost.setEntity(entity); 
    HttpResponse response = null; 
    try { 
     response = httpclient.execute(httppost); 
    } catch (ClientProtocolException e) { 
     return false; 
    } catch (IOException e) { 
     return false; 
    } 
    HttpEntity result = response.getEntity(); 

    // Success! 
    if(response.getStatusLine().getStatusCode() == 200) { 
     System.out.println("Confluence -> Exported to the page with ID: " + confPageID); 
     return true; 
    } 
    else { 
     System.out.println("Confluence -> Error : " + response.getStatusLine().getStatusCode()); 
     System.out.println(response + "\n" + "\n" + response.getAllHeaders() + "\n" + result + "\n" + path + "\n" + "Attempted against: " + baseURL + "/rest/api/content/" + pageID + "/child/attachment" + "\n"); 
     return false; 
    } 
}; 
+0

Привет, может быть, было обновление, но мой код предназначался для JIRA, а не Confluence :) –

+0

А как же это произошло тогда :). Спасибо за обновление :) – 0X29A

Смежные вопросы