2013-08-06 2 views
0

안녕하세요. 저는 주로 Android 개발자이며 http 프로토콜에 대해 매우 우둔합니다. 도움을 많이 주시면 도움이됩니다.Android Http Post to REST Api

API 호출을 시도하고 있습니다 : http://api.haikutest.com/developer/apidoc/assignments.html 여기서 장치에 파일을 POST합니다.

그들은 샘플 요청 수득 :

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 

및 설명 상태 파일 PARAM이 있음 : 파일명의 해시 베이스 64를 포함하는 각 요소와 파일

어레이 부호화 파일

이것은 내가 지금 시도하고있는 코드입니다 (참고 : Android 용 Robospice + Spring을 사용하고 있습니다) :

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 문서 다음에 스트림을 param으로 배치해야합니까? 또한 이것을 구현하는 올바른 방법은 무엇입니까? 나는 사용자에게 파일 크기 제한을 두지 않아도되므로 스트림을 사랑한다. Base64로 인코딩 된 작은 파일로 작업하고 직접 매개 변수로 사용할 수있게되었지만 ...

모든 도움을 주실 수 있습니다! 나는 확실히 작은 포인터에 대한 의견이나 답변을 downvote하지 않습니다.

업데이트 코드 업데이트,하지만 또 다른 오류 메시지가 얻을 : 당신이 Spring for Android을 사용하고 같은

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] 
+1

내가 확실히 모르겠지만,이 서비스가 단순히 샘플 요청 @stefan 1 개 완전한 요청 –

+0

을 보낼 것으로 예상 경우, 이상 파일을 스트리밍 할 수 있습니다 의심이있는 워드 파일을 가지고 있으며, PDF를 매우 짧습니다 ... 어떻게 그랬습니까? –

답변

1

이 보이는합니다. 그 오류 메시지로 판단하면 스프링이 콘텐츠 형식을 application/json으로 설정하고있는 것 같습니다. 나는 application/x-www-form-urlencoded을 보내려고합니다.

headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); 

봄이 다음 알 적절한 MessageConverter에 맞게 : 그래서이 Content-Type 헤더를 설정합니다. 이 here에 대한 자세한 정보.

EDIT : 또한 요청 데이터가 요청 URI가 아닌 POST 데이터로 전송됩니다. 그걸 MultiValuesMap으로 옮기세요. 이러한 데이터를 게시하는 방법을 알려준 링크를 살펴보십시오. 이들에 대한 완전한 문서는 here에서도 찾을 수 있습니다.

EDIT2 응답에 대해서도 MessageConverter을 설정해야합니다. 같은 뭔가 :

EDIT3 당신이 InputStreamResource 더 구체적으로, Resource 사용을 고려, 파일을 전송해야하는 경우

List<MediaType> acceptableMediaTypes = new ArrayList<MediaType>(); 
acceptableMediaTypes.add(MediaType.APPLICATION_JSON); 
headers.setAccept(acceptableMediaTypes); 
. 하지만 속임수가 있습니다 : 파일 이름과 파일 크기를 제공해야합니다. 그렇지 않으면 요청이 중단됩니다.뭔가 같이 :

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(); 
       } 
      }; 
+0

집에 왔을 때 고맙습니다. –

+0

시도했지만 작동하지 않았습니다 ...이를 반영하기 위해 제 질문이 업데이트되었습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까? –

+0

보내는 메시지에 해당하는 MessageConverter를 찾는 것이 중요합니다. 'headers.setContentType (MediaType.TEXT_PLAIN); 시도해 주시겠습니까? – gunar