2017-12-31 18 views
1

郵便配達員が私のサーバーにファイルと情報を送信するためのクエリを生成しました。私のプログラムでうまく動作します。PartMapのRetrofitとWebKitFormBoundaryを使用してサーバーにファイルを送信する

MediaType mediaType = MediaType.parse("multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW"); 
     RequestBody body = RequestBody.create(mediaType, 
       "------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=\"filename\"; filename=\"C:\\testFile.doc\"\r\nContent-Type: application/msword\r\n\r\n\r\n" + 
         "------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=\"id\"\r\n\r\n7\r\n" + 
         "------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=\"type\"\r\n\r\n3\r\n" + 
         "------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=\"note\"\r\n\r\nafejhejfh\r\n" + 
         "------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=\"list[0][id]\"\r\n\r\n1\r\n" + 
         "------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=\"list[0][is_checked]\"\r\n\r\n0\r\n" + 
         "------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=\"list[0][filename]\"; filename=\"C:\\test.pdf\"\r\nContent-Type: application/pdf\r\n\r\n\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW--"); 

改修方法:

​​

初めてwebkitformboundaryに直面して、動的にPartmapを作成するために、サンプルの上に変更する必要があります。いくつかのパラメータを別のリストからサイクルに追加する必要があるためです。 私は例以下のようなものでpartmapを生成し、サーバ

クエリ地図からAPIドキュメントにコードリターン422エラー以下

--header 'Authorization: {{authorization}}' \ 
    --header 'content-type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW' \ 

を書いたように、ヘッダーに「WebKitFormBoundary7MA4YWxkTrZu0gW」を追加しようとしました。

Map<String, RequestBody> requestMap = new HashMap<>(); 

RequestBody file = null; 
if (file != null) { 
    file = RequestBody.create(MediaType.parse("application/msword"), testFile); 
    requestMap.put("filename", file); 
} 

RequestBody id = RequestBody.create(MediaType.parse("text/plain"), "18"); 
RequestBody type = RequestBody.create(MediaType.parse("text/plain"), "3"); 
RequestBody notes = RequestBody.create(MediaType.parse("text/plain"), notesTextArea.getText()); 
RequestBody list0id = RequestBody.create(MediaType.parse("text/plain"), "1"); 
RequestBody list0is_checked = RequestBody.create(MediaType.parse("text/plain"), "0"); 


RequestBody pdfFilename = null; 
if (pdfFile != null) { 
    pdfFilename = RequestBody.create(MediaType.parse("application/pdf"), pdfFile); 
    requestMap.put("list[0][filename]", pdfFilename); 
} 

requestMap.put("file", file); 
requestMap.put("id", id); 
requestMap.put("type", type); 
requestMap.put("notes", notes); 
requestMap.put("list[0]id", list0id); 
requestMap.put("list[0]is_checked", list0is_checked); 

改造方法:

@Multipart 
    @Headers({"Accept: application/json", "content-type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW"}) 
    @POST("api/save") 
    Call<SaveResponse> save(@Header("Authorization") String authorization, 
             @PartMap Body map); 

だから私は私のPartmapにWebKitFormBoundary7MA4YWxkTrZu0gWや他の必要な情報を置くことができる方法を理解するために、任意の助けを必要としています。

ご協力いただきありがとうございます。

p.s.新しい年のコーダー)

答えて

0

このようにこの問題を解決します。

私のサーバーにリクエストしてください。ヘッダなしのリクエスト「コンテンツ・タイプ:マルチパート/フォームデータ;境界= ---- WebKitFormBoundary7MA4YWxkTrZu0gW」APIドキュメントに記載されている」

@Multipart 
    @Headers({"Accept: application/json"}) 
    @POST("api/save") 
    Call<SaveResponse> save(@Header("Authorization") String authorization, 
             @PartMap Map<String, RequestBody> map, 
             @Part List<MultipartBody.Part> files); 

動的に私たちのクエリ

private void fillQuery() { 

     fileListPart = new ArrayList<>(); 
     MultipartBody.Part filePart = null; 
     if (mainFile != null) { 
      if (mainFile.getName().endsWith(".pdf")) { 
       filePart = MultipartBody.Part.createFormData("filename", mainFile.getName(), RequestBody.create(MediaType.parse("application/pdf"), mainFile)); 
      } else if (mainFile.getName().endsWith(".doc") || mainFile.getName().endsWith(".docx")) { 
       filePart = MultipartBody.Part.createFormData("filename", mainFile.getName(), RequestBody.create(MediaType.parse("application/msword"), mainFile)); 
      } 
      fileListPart.add(filePart); 
     } 

     requestBodyMap = new HashMap<>(); 
     RequestBody id = RequestBody.create(MediaType.parse("text/plain"), "id"); 
     RequestBody type = RequestBody.create(MediaType.parse("text/plain"), "type"); 
     RequestBody notes = RequestBody.create(MediaType.parse("text/plain"), "notes"); 

     requestBodyMap.put("id", id); 
     requestBodyMap.put("type", type); 
     requestBodyMap.put("notes", notes); 

     for (int i = 0; i < dynamicCollectionWirhParameters.size(); i++) { 
      String prefix = "list["; 
      String checkIdParameter = "][id]"; 
      String checkIsCheckedParameter = "][is_checked]"; 
      String checkFileParameter = "][filename]"; 

      RequestBody checklist_id = RequestBody.create(MediaType.parse("text/plain"), "2");//id 
      RequestBody is_checked = RequestBody.create(MediaType.parse("text/plain"), "1"); // server convert 1 and 0 to boolean value 
      requestBodyMap.put(prefix + i + checkIdParameter, checklist_id); 
      requestBodyMap.put(prefix + i + checkIsCheckedParameter, is_checked); 

      if (dynamicCollectionFileCollection.get(i) != null) { 
       File tempFile = dynamicCollectionFileCollection.get(i); 
       filePart = null; 
       if (tempFile.getName().endsWith(".pdf")) { 
        filePart = MultipartBody.Part.createFormData(prefix + i + checkFileParameter, dynamicCollectionFileCollection.get(i).getName(), RequestBody.create(MediaType.parse("application/pdf"), dynamicCollectionFileCollection.get(i))); 
       } else if (dynamicCollectionFileCollection.get(i).getName().endsWith(".doc") || dynamicCollectionFileCollection.get(i).getName().endsWith(".docx")) { 
        filePart = MultipartBody.Part.createFormData(prefix + i + checkFileParameter, dynamicCollectionFileCollection.get(i).getName(), RequestBody.create(MediaType.parse("application/msword"), dynamicCollectionFileCollection.get(i))); 
       } 
       fileListPart.add(filePart); 
      } 
     } 

    } 

を記入し、私たちを送信します。サーバーへの件のデータ

private void saveDatas() { 
     fillQuery(); 

     Call<SaveResponse> sendDatasCall = DependenciesStorage.getRetrofitService().save(
       DependenciesStorage.getAuthorizationKey(), 
       requestBodyMap, fileListPart); 

     sendDatasCall.enqueue(new Callback<SaveResponse>() { 
      @Override 
      public void onResponse(Call<SaveResponse> call, Response<SaveResponse> response) { 
       if (response.isSuccessful()) { 

        } else { 

       } 
      } 

      @Override 
      public void onFailure(Call<SaveResponse> call, Throwable throwable) { 
      } 
     }); 

    } 

は簡単に見える)しかし、私はそれを

を見つけることはほぼ2日を過ごします