2016-07-22 2 views
1

こんにちは私は私のプロジェクトでアップロードAPIで作業しています。 jersyクライアントを使用してデータを送信し、応答を得ることができます。Apache - CXFクライアントでアップロードファイルのポストコールでmultipart/formDataを送信する方法は?

レスポンスとして200を取得しています。ここにそのコードがあります。

final Client client = ClientBuilder.newBuilder().register(MultiPartFeature.class).build(); 
    client.register(new LoggingFilter()); 
    FileDataBodyPart filePart = new FileDataBodyPart("file", new File("/Users/rasaminathan/Desktop/test.txt")); 
    FormDataMultiPart formDataMultiPart = new FormDataMultiPart(); 
    FormDataMultiPart multipart = (FormDataMultiPart) formDataMultiPart.field("param1", "paramValue") 
               .field("param2", "value") 
               .bodyPart(filePart); 
    final WebTarget target = client.target("http://URL:8000/apiPath"); 
    final Response response = target.request().post(Entity.entity(multipart, multipart.getMediaType())); 

これはログです。

Jul 22, 2016 12:15:14 PM org.glassfish.jersey.filter.LoggingFilter log 
    INFO: 1 * Sending client request on thread main 
    1 > POST http://URL:8000/apiPath 
    1 > Content-Type: multipart/form-data 

    Jul 22, 2016 12:15:15 PM org.glassfish.jersey.filter.LoggingFilter log 
    INFO: 1 * Client response received on thread main 
    1 < 200 
    1 < Content-Length: 203 
    1 < Content-Type: application/json 
    1 < Date: Fri, 22 Jul 2016 06:45:14 GMT 
    1 < X-Powered-By: Servlet/2.5 JSP/2.1 

私のプロジェクトでは、CXFを使用することになっています。 CXF Webクライアントでも同じことを試しました。しかし、 "401" Unauthorized Errorが発生しています。 ここにコードがあります。

WebClient client = WebClient.create("http://URL:8000"); 
    String path = "apiPath"; 
    client.type(MediaType.MULTIPART_FORM_DATA) 
      .path(path); 

    ClientConfiguration config = WebClient.getConfig(client); 
    config.getInInterceptors().add(new LoggingInInterceptor()); 
    config.getOutInterceptors().add(new LoggingOutInterceptor()); 

    List<Attachment> atts = new LinkedList<Attachment>(); 
    atts.add(new Attachment("file", "application/octet-stream", new ByteArrayInputStream("testContent".getBytes()))); 
    atts.add(new Attachment("param1","text/plain","paramValue")); 
    atts.add(new Attachment("param2","text/plain","value")); 
    MultipartBody body = new MultipartBody(atts); 
    Response response= client.post(body); 

これはログです。

 Jul 22, 2016 12:23:41 PM org.apache.cxf.interceptor.LoggingOutInterceptor 
     INFO: Outbound Message 
     --------------------------- 
     ID: 1 
     Address: http://URL:8000/apiPath 
     Http-Method: POST 
     Content-Type: multipart/form-data; boundary="uuid:14597725-d376-4643-92f9-7a4a64ae1054" 
     Headers: {Accept=[*/*]} 
     Payload: --uuid:14597725-d376-4643-92f9-7a4a64ae1054 
     Content-Type: application/octet-stream 
     Content-Transfer-Encoding: binary 
     Content-ID: <file> 

     testContent 
     --uuid:14597725-d376-4643-92f9-7a4a64ae1054 
     Content-Type: text/plain 
     Content-Transfer-Encoding: binary 
     Content-ID: <param1> 

     paramValue 
     --uuid:14597725-d376-4643-92f9-7a4a64ae1054 
     Content-Type: text/plain 
     Content-Transfer-Encoding: binary 
     Content-ID: <param2> 

     value 
     -------------------------------------- 
     Jul 22, 2016 12:23:42 PM org.apache.cxf.interceptor.LoggingInInterceptor 
     INFO: Inbound Message 
     ---------------------------- 
     ID: 1 
     Response-Code: 401 
     Encoding: UTF-8 
     Content-Type: text/html; charset=UTF-8 
     Headers: {Content-Length=[46], content-type=[text/html; charset=UTF-8], Date=[Fri, 22 Jul 2016 06:53:42 GMT], X-Powered-By=[Servlet/2.5 JSP/2.1]} 
     -------------------------------------- 

「Param1、Param2」というパラメータは正しく送信されないと思います。それは私が401エラーを取得している理由だと思います。 CXF Webクライアントでデータを正しく送信していますか?そうでない場合は、コードを修正するのを手伝ってください。

答えて

1

すべての添付ファイルにコンテンツの処理を設定すると、問題を解決するのに役立ちました。私は解決策を見つけた here.

私がParam1を推測したように、param2の値はサーバーに到達しませんでした。

 List<Attachment> atts = new LinkedList<Attachment>(); 
     ContentDisposition cd = new ContentDisposition("form-data; name=\"file\";filename=\"test.txt\""); 
     atts.add(new Attachment("file", new ByteArrayInputStream("testContent".getBytes()),cd)); 
     ContentDisposition cd1 = new ContentDisposition("form-data; name=\"param1\";"); 
     atts.add(new Attachment("param1",new ByteArrayInputStream("paramValue".getBytes()),cd1)); 
     ContentDisposition cd2 = new ContentDisposition("form-data; name=\"param2\";"); 
     atts.add(new Attachment("param2",new ByteArrayInputStream("value".getBytes()),cd1)); 
     MultipartBody body = new MultipartBody(atts); 
     Response response= client.post(body); 

今、私は成功応答

を取得しています
関連する問題