是否可以使用 resttemplate 在 azure blob 存储中上传文件 - Java

Is it possible to use resttemplate to upload file in azure blob storage - Java

有没有办法使用 Java - Spring 框架中的 rest 模板将文件上传到 Azure blob 存储?我看到所有使用 SDK 的示例都成功了,但我们被告知不要使用 SDK - Java。 我知道问题是 10,000 英尺高,但任何 pointers/direction 都会有很大帮助。

不知道为什么不使用 SDK,也不知道谁会告诉你。

无论如何,是的,你可以使用 RestTemplate 或更好的 webClient

您只需将SDK发送的请求映射到云端即可。

您必须手动添加 header 身份验证。序列化我想的文件。

当您拥有受支持的客户端 SDK 时,工作量很大。

例如,这是一个使用 WebClient 为 Redmine 服务器发送的简单请求

String url = "http://localhost:3001/projects.json"; //Redmine local server
RestTemplate restTemplate = new RestTemplate();
JSONObject object = new JSONObject();   //Json object that will need to be sent to redmine
object.put("name", "dummyName");        // Should look like this
object.put("identifier", "dummyId");    // {"project":{"identifier":"dummyId","name":"dummyName"}}
JSONObject body = new JSONObject();     
body.put("project", object);            
String plainCreds = "user:bitnami1"; // default basic auth encoding
byte[] plainCredsBytes = plainCreds.getBytes();
byte[] base64CredsBytes = Base64.encodeBase64(plainCredsBytes);
String base64Creds = new String(base64CredsBytes);
HttpHeaders headers = new HttpHeaders();
headers.add("Authorization", "Basic " + base64Creds); 
headers.add("Content-Type", "application/json");
RequestEntity<JSONObject> requestEntity = RequestEntity
                .post(new URI(url))
                .accept(MediaType.APPLICATION_JSON)
                .headers(headers)
                .body(body);
ResponseEntity<String> r = restTemplate.exchange(requestEntity, String.class);

这就是使用 RestTemplate 时相同示例的样子

String url = "http://localhost:3001/projects.json"; //Redmine local server
RestTemplate restTemplate = new RestTemplate();
JSONObject object = new JSONObject();   //Json object that will need to be sent to redmine
object.put("name", "dummyName");        // Should look like this
object.put("identifier", "dummyId");    // {"project":{"identifier":"dummyId","name":"dummyName"}}
JSONObject body = new JSONObject();     
body.put("project", object);            
String plainCreds = "user:bitnami1"; // default basic auth encoding
byte[] plainCredsBytes = plainCreds.getBytes();
byte[] base64CredsBytes = Base64.encodeBase64(plainCredsBytes);
String base64Creds = new String(base64CredsBytes);
HttpHeaders headers = new HttpHeaders();
headers.add("Authorization", "Basic " + base64Creds); 
headers.add("Content-Type", "application/json");
HttpEntity<Object> entity = new HttpEntity<Object>(body, headers);
ResponseEntity<String> result = restTemplate.exchange("http://localhost:3001/projects.json",
                HttpMethod.POST,
                entity,
                String.class);

这两个都是可能的,因为我正在尝试匹配此 curl 请求

curl --location --request POST 'localhost:3001/projects.json' \
--header 'Authorization: Basic dXNlcjpiaXRuYW1pMQ==' \
--header 'Content-Type: application/json' \
--data-raw '{"project":{"identifier":"dummyId","name":"dummyName"}}'

所以一旦您知道请求是什么样子,您就可以使用 RestTemplate 或 WebClient,或任何其他类似的 class 来构建您的请求。