0

multipart/form-data 요청을 API에 보냈습니다. Apache의 commons-httpclient 3.1을 사용하면 작동하지만 httpclient 4.3.5로 전환해도 API에 문제가 있습니다. 아래 두 코드 샘플을 찾을 수 있습니다. Salesforce API와 관련이 있기 때문에 SFSE에 질문을 게시했습니다. 내 또는 자신의 측면에서 여전히 문제인지 잘 모르겠습니다. 그러나 여기 내 질문은 : 코드를 4.3.5로 올바르게 마이그레이션 했습니까? 그렇다면 multipart/form-data 요청을 실행하는 것과 관련된 httpclient의 동작이 변경된 것입니까?Commons HttpClient에서 HttpComponents로 전환 한 후 '부적절한 형식의 요청'오류가 발생했습니다.

코드 샘플은 다음과 같습니다

평민 - HttpClient를 3.1

String json = "{ \"body\":{ \"messageSegments\":[ { \"type\":\"Text\", \"text\":\"Here is another receipt.\" } ] }, \"capabilities\":{ \"content\":{ \"title\":\"receipt2\"} } }"; 

PostMethod filePost = new PostMethod("https://eu3.salesforce.com/services/data/v32.0/chatter/feed-elements/<some_feed_element_id>/capabilities/comments/items"); 
filePost.addRequestHeader("Authorization", token()); 

StringPart jsonPart = new StringPart("json", json); 
jsonPart.setContentType(ContentType.APPLICATION_JSON.getMimeType()); 

FilePart filePart = new FilePart("feedElementFileUpload", file); 
filePart.setContentType(ContentType.APPLICATION_OCTET_STREAM.getMimeType()); 

Part[] parts = { jsonPart, filePart }; 
filePost.setRequestEntity(new MultipartRequestEntity(parts, filePost.getParams())); 
int response = httpclient.executeMethod(filePost); 

와이어/컨텍스트 로그 : http://pastebin.com/RCg20Ygn

HttpClient를 4.3.5

String json = "{ \"body\":{ \"messageSegments\":[ { \"type\":\"Text\", \"text\":\"Here is another receipt.\" } ] }, \"capabilities\":{ \"content\":{ \"title\":\"receipt2\"} } }"; 

String attachmentName = "package.xml"; 
CloseableHttpClient client = HttpClientBuilder 
    .create() 
    .setDefaultHeaders(Lists.newArrayList()) 
    .build(); 
HttpPost post = new HttpPost(
    "https://eu3.salesforce.com/services/data/v32.0/chatter/feed-elements/<feed_element_id>/capabilities/comments/items" 
); 
post.addHeader(HttpHeaders.AUTHORIZATION, token()); 
post.addHeader(HttpHeaders.CONTENT_TYPE, ContentType.MULTIPART_FORM_DATA.getMimeType()); 

post.setEntity(
    MultipartEntityBuilder.create() 
     .setStrictMode() 
     .addPart(
      "json", 
      new StringBody(
       json, 
       ContentType.APPLICATION_JSON 
      ) 
     ) 
     .addPart(
      "feedElementFileUpload", 
      new FileBody(
       new File(attachmentName), 
       ContentType.APPLICATION_OCTET_STREAM, 
       attachmentName 
      ) 
     ) 
     .build() 
); 
CloseableHttpResponse response = client.execute(post); 
,536,913,632을 10

와이어/컨텍스트 로그 : http://pastebin.com/EHXd1y50

업데이트 1 : 나는 MultipartEntityBuilder (STRICT, BROWSER_COMPATIBLE, RFC6532)에 대한 모든 세 가지 모드를 시도했습니다

,하지만 여전히 작동하지 않습니다.

답변

1

하는 대신 '엄격한'MultipartEntityBuilder

로 요청 엔티티를 구성

UPDATE의 '브라우저 호환'모드를 사용하여 시도 1 :

"Content-Type: multipart/form-data[\r][\n]" 

이 (경계 속성이없는) 분명히 잘못하고 요청이 거부되는 이유가 될 가능성이 있습니다.

이 줄을 제거하고 다시 답장을 보내

post.addHeader(HttpHeaders.CONTENT_TYPE, ContentType.MULTIPART_FORM_DATA.getMimeType()); 
+0

감사를 시도하십시오! 나는 지금까지 세 가지 모드를 모두 사용해 보았지만 여전히 작동하지 않습니다. –

+1

HC3 및 HC4 세션의 전선/컨텍스트 로그를 게시합니다. 자세한 내용은 HttpClient 로깅 가이드를 참조하십시오. – oleg

+0

해당 코드 샘플 아래에 로그를 추가했습니다. –

관련 문제