2014-04-11 4 views
4

google-http-java-client * docs에서 파일 필드가있는 양식을 게시하는 방법은 명확하지 않습니다. 예를 들어google-http-java-client를 사용하여 멀티 파트 양식 게시

나는 Google 클라우드 프린트 API를 사용하여 문서를 인쇄하기 위해 노력하고있어 :

HttpRequestFactory httpRequestFactory = getHttpRequestFactory(); 

Map<String, Object> parameters = Maps.newHashMap(); 
parameters.put("printerId", printRequest.getPrinterId()); 
parameters.put("title", printRequest.getTitle()); 
parameters.put("contentType", printRequest.getContentType()); 
parameters.put("ticket", new Gson().toJson(printRequest.getOptions())); 

MultipartContent content = new MultipartContent(); 
content.addPart(new MultipartContent.Part(new UrlEncodedContent(parameters))); 
content.addPart(new MultipartContent.Part(
     new FileContent(printRequest.getContentType(), printRequest.getFile()))); 

try { 
    HttpResponse response = httpRequestFactory.buildPostRequest(
      SubmitUrl, content).execute(); 
    System.out.println(IOUtils.toString(response.getContent())); 
} catch (IOException e) { 
    String message = String.format(); 
    System.out.println("Error submitting print job: " + e.getMessage()); 
} 

을 불행하게도이 작동하지 않습니다. API가 '이 요청에 필요한 프린터 ID'오류를 반환합니다. 요청이 제대로 형성되지 않은 것처럼 보입니다.

내가 뭘 잘못하고 있니?

* 특별히 OAuth 토큰 등의 자동 새로 고침을 처리 할 때 google-http-java-client를 사용하고 있습니다. 다른 HTTP 클라이언트 사용과 관련된 솔루션으로 회신하지 마십시오.

답변

13

폼 필드가 멀티 파트 메시지에 추가되는 방식을 잘못 이해 한 것처럼 보입니다. 작업 코드는 지금을 "multipart/form-data"와 "내용 - 처리"헤더와 함께 자신의 일환으로 각 필드를 추가를 지정하려면 위의 기본 HttpMediaType을 무시하고이

HttpRequestFactory httpRequestFactory = getHttpRequestFactory(username); 

Map<String, String> parameters = Maps.newHashMap(); 
parameters.put("printerid", printRequest.getPrinterId()); 
parameters.put("title", printRequest.getTitle()); 
parameters.put("contentType", printRequest.getContentType()); 

// Map print options into CJT structure 
Map<String, Object> options = Maps.newHashMap(); 
options.put("version", "1.0"); 
options.put("print", printRequest.getOptions()); 
parameters.put("ticket", new Gson().toJson(options)); 

// Add parameters 
MultipartContent content = new MultipartContent().setMediaType(
     new HttpMediaType("multipart/form-data") 
       .setParameter("boundary", "__END_OF_PART__")); 
for (String name : parameters.keySet()) { 
    MultipartContent.Part part = new MultipartContent.Part(
      new ByteArrayContent(null, parameters.get(name).getBytes())); 
    part.setHeaders(new HttpHeaders().set(
      "Content-Disposition", String.format("form-data; name=\"%s\"", name))); 
    content.addPart(part); 
} 

// Add file 
FileContent fileContent = new FileContent(
     printRequest.getContentType(), printRequest.getFile()); 
MultipartContent.Part part = new MultipartContent.Part(fileContent); 
part.setHeaders(new HttpHeaders().set(
     "Content-Disposition", 
     String.format("form-data; name=\"content\"; filename=\"%s\"", printRequest.getFile().getName()))); 
content.addPart(part); 

try { 
    HttpResponse response = httpRequestFactory.buildPostRequest(
      SubmitUrl, content).execute(); 
    System.out.println(IOUtils.toString(response.getContent())); 
} catch (IOException e) { 
    ... 
} 

가장 중요한 부분처럼 보인다 양식 필드 이름을 지정하십시오.

+0

"printRequest.getContentType()"코드의 내용은 무엇입니까? –