簡體   English   中英

Android Http Post到REST Api

[英]Android Http Post to REST Api

嗨,我主要是一名Android開發人員,對http協議一無所知,您的幫助將不勝感激!

我試圖對此進行api調用: http : //api.haikutest.com/developer/apidoc/assignments.html我在設備上張貼文件的位置。

他們提供了以下示例請求:

POST /api/assignments/3/submit
message[subject]=Subject+of+the+message&message[body]=Some+long+text&message[sent_at]=2013-07-05&message[draft]=0&message[assignment_id]=3&files[][file]=%23%3CFile%3A0x007ff59c9c1de8%3E&files[][filename]=test.pdf

在描述狀態下,文件參數為:

文件數組,每個元素包含文件名和base64編碼文件的哈希

這是我現在正在嘗試的代碼(注意:我正在使用Robospice + Spring for Android):

   File file = new File(Environment.getExternalStorageDirectory() +
                "/DCIM/Camera/1357279228432.jpg");
        Base64InputStream stream = new Base64InputStream(new FileInputStream(file), 0);
        HttpHeaders headers = new HttpHeaders();
        headers.add("x-haiku-auth", HaikuAPI.getAuthHeader());
        headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
        MultiValueMap<String, Object> parts = new LinkedMultiValueMap<String, Object>();
        parts.add("files[][file]", parts);
        HttpEntity<Object> request = new HttpEntity<Object>(stream, headers);
        UriComponentsBuilder builder = UriComponentsBuilder
                .fromUriString(
                        "https://" + HaikuAPI.getDomain() + "/api/assignments")
                .pathSegment(assignmentID + "", "submit")
                .queryParam("message[subject]", "Assignment Completed")

                .queryParam("message[body]", message)
                .queryParam("message[assignment_id]", assignmentID)
                .queryParam("files[][filename]", "test.jpg");

        URI url = builder.build().toUri();

        String response = getRestTemplate().postForObject(url, request, String.class);
        return response;

但是我收到一條錯誤消息,說它無法將流序列化為JSON。 根據API文檔,我是否必須將流作為參數放置? 另外,實現此目標的正確方法是什么? 如果我不必對用戶(因此流)設置文件大小限制,我將非常喜歡。 雖然我已經將其與以Base64編碼並直接作為參數放置的小文件一起使用...

任何幫助是極大的贊賞! 對於小指針,我絕對不會拒絕評論或答案。

更新

更新了代碼,但仍然收到另一條錯誤消息:

00:25:50.904 Thread-2066 An exception occurred during request network execution :Could not write request: no suitable HttpMessageConverter found for request type [org.springframework.util.LinkedMultiValueMap] and content type [application/x-www-form-urlencoded]

看起來您正在使用Spring for Android 從該錯誤消息來看,Spring似乎將內容類型強制為application/json ,而我相信您正在嘗試發送application/x-www-form-urlencoded 因此,請設置以下Content-Type標頭:

headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);

然后Spring會知道要匹配正確的MessageConverter 在此更多信息在這里

編輯 :另外,您應該以POST數據而不是請求URI的形式發送請求數據。 將其移動到MultiValuesMap 看看我給您提供的如何發布此類數據的鏈接。 關於這些的完整文檔也可以在這里找到。

EDIT2您還需要為您的響應設置MessageConverter 就像是:

List<MediaType> acceptableMediaTypes = new ArrayList<MediaType>();
acceptableMediaTypes.add(MediaType.APPLICATION_JSON);
headers.setAccept(acceptableMediaTypes);

EDIT3如果您需要發送文件,請考慮使用Resource ,以更具體地講InputStreamResource 但是有一個竅門:您需要提供文件名和文件大小,否則您的請求將崩潰。 就像是:

Resource res = new InputStreamResource(context.getContentResolver().openInputStream(itemImage)) {
                @Override
                public String getFilename() throws IllegalStateException {
                    return fileInfo.getFileName();
                }

                @Override
                public long contentLength() throws IOException {
                    return fileInfo.getFileSizeInBytes();
                }
            };

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM