关闭。这个问题需要更加突出重点。它目前不接受答案。**想改进这个问题吗?**通过编辑这篇文章更新这个问题,使它只关注一个问题。
5年前关门了。改进这个问题如何使用纯java.net将文件附加到使用asanaapi的任务?具体来说,如何向asanaapi发出格式良好的httppost多部分/表单数据编码请求,以便成功地将文件附加到任务?
6mw9ycah1#
asana api期望通过http post请求将附件上载到任务,该请求包含一个多部分/表单数据编码文件:https://asana.com/developers/api-reference/attachments#upload正如本回答中关于换行符上的http规范所解释的,请确保您使用的是 \r\n 换行符,因为java将转换最多 println() 与平台相关的方法 line.separator 而且asana服务器可能不能容忍格式不正确的换行。格式良好的多部分/表单数据post请求如下所示:
\r\n
println()
line.separator
Authorization: Basic <BASE64_ENCODED_AUTH> Content-Type: multipart/form-data; boundary=14d07d7cbcf User-Agent: Java/1.7.0_76 Host: localhost:8080 Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2 Connection: keep-alive Content-Length: 141 --14d07d7cbcf Content-Disposition: form-data; name="file"; filename="example.txt" Content-Type: text/plain A file --14d07d7cbcf--
这是一个java实现,它纯粹使用java.net类为asana attachments api手动构造一个格式良好的多部分/表单数据编码post请求:
import org.apache.commons.codec.binary.Base64; import java.io.*; import java.net.HttpURLConnection; import java.net.URL; public class AttachFileToTask { // Use HTTP compliant line feeds in the request. // Note that Java println() methods may use platform dependent line feeds. private static String LINE_FEED = "\r\n"; public static void main(String[] args) throws Exception { // Task attachments endpoint String url = "https://app.asana.com/api/1.0/tasks/<TASK_ID>/attachments"; File theFile = new File("/path/to/file.txt"); HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection(); // Set basic auth header String apiKey = "<API_KEY>" + ":"; String basicAuth = "Basic " + new String(new Base64().encode(apiKey.getBytes())); connection.setRequestProperty("Authorization", basicAuth); // Indicate a POST request connection.setDoOutput(true); // A unique boundary to use for the multipart/form-data String boundary = Long.toHexString(System.currentTimeMillis()); // Construct the body of the request connection.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary); PrintWriter writer = null; try { writer = new PrintWriter(new OutputStreamWriter(connection.getOutputStream(), "UTF-8")); String fileName = theFile.getName(); writer.append("--" + boundary).append(LINE_FEED); writer.append("Content-Disposition: form-data; name=\"file\"; filename=\"" + fileName + "\"").append(LINE_FEED); writer.append("Content-Type: text/plain").append(LINE_FEED); writer.append(LINE_FEED); BufferedReader reader = null; try { reader = new BufferedReader(new InputStreamReader(new FileInputStream(theFile), "UTF-8")); for (String line; (line = reader.readLine()) != null; ) { writer.append(line).append(LINE_FEED); } } finally { if (reader != null) try { reader.close(); } catch (IOException logOrIgnore) { } } writer.append(LINE_FEED); writer.append("--" + boundary + "--").append(LINE_FEED); writer.append(LINE_FEED); writer.flush(); writer.close(); } catch (Exception e) { System.out.append("Exception writing file" + e); } finally { if (writer != null) writer.close(); } System.out.println(connection.getResponseCode()); // Should be 200 System.out.println(connection.getResponseMessage()); } }
请注意,不鼓励在个人使用或开发实用程序脚本之外使用api密钥进行基本身份验证。为多个用户部署生产应用程序时,请使用asana connect(oauth 2.0)
1条答案
按热度按时间6mw9ycah1#
asana api期望通过http post请求将附件上载到任务,该请求包含一个多部分/表单数据编码文件:
https://asana.com/developers/api-reference/attachments#upload
正如本回答中关于换行符上的http规范所解释的,请确保您使用的是
\r\n
换行符,因为java将转换最多println()
与平台相关的方法line.separator
而且asana服务器可能不能容忍格式不正确的换行。格式良好的多部分/表单数据post请求如下所示:
这是一个java实现,它纯粹使用java.net类为asana attachments api手动构造一个格式良好的多部分/表单数据编码post请求:
请注意,不鼓励在个人使用或开发实用程序脚本之外使用api密钥进行基本身份验证。为多个用户部署生产应用程序时,请使用asana connect(oauth 2.0)