2016-11-15 19 views
4

好傢伙是我的示例代碼改造 - 拋出異常java.lang.IllegalArgumentException異常:只有一個編碼註釋被允許在這裏

@FormUrlEncoded 
@Multipart 
@POST("registration.php") 
Call<Signup> getSignupResponse(@Field("email") String email, 
           @Field("lname") String lname, 
           @Field("fname") String fname, 
           @Field("password") String password, 
           @Part("filename") File file); 

問題是,當我試圖添加文件參數作爲其部分我扔其他明智的錯誤,如果我只使用@Field它很好,但不工作後,我添加@Part在它
- 有沒有辦法使用@Field和@part一起在改造?
- 如果是不是告訴一個道理,如果不告訴我正確的方式

我會感謝你的答案,謝謝你提前

注:請告訴我評論的建議你投票之前。

+0

remove'@FormU rlEncoded'註釋..... – sushildlh

+0

@sushildlh我試過,如果我刪除@ FormUrlEncoded比我得到這個>> java.lang.IllegalArgumentException:@字段參數只能用於表單編碼。 –

+0

使用'@ Part'而不是'@ Field' .......... – sushildlh

回答

7

您不能在單一方法上同時使用@FormUrlEncoded和@Multipart。 HTTP請求只能有一個內容類型,並且這兩個內容類型都是 。

@FormUrlEncoded(for android)| 應用程序/ x-WWW窗體-urlencoded(網頁)

@Multipart(對於機器人)| 的multipart/form-data的(網頁)

使用這樣.....

@Multipart 
    @POST("photos/upload") 
    Call<Result> upload(@Part("Token") RequestBody token, @Part("Photo_Type") RequestBody type, @Part MultipartBody.Part file); 

和在像這樣的呼叫.....

String token="your string"; 

File file = new File(path); 
RequestBody tokenRequest = RequestBody.create(MediaType.parse("text/plain"), token); 
RequestBody type = RequestBody.create(MediaType.parse("text/plain"), true + ""); 

MultipartBody.Part filePart = MultipartBody.Part.createFormData("file", file.getName(), RequestBody.create(MediaType.parse("image/*"), file)); 



    Call<Result> call = qikGrubApi.upload(tokenRequest, type, filePart); 

     call.enqueue(new Callback<Result>() { 
      @Override 
      public void onResponse(Call<Result> call, Response<Result> response) { 
       progress.dismiss(); 
       if (response.isSuccessful()) { 
        if (response.body().getSuccess()) { 
         nextPage(response.body().getMessage()); 
        } else 
         Toast.makeText(UploadActivity.this, response.body().getMessage(), Toast.LENGTH_SHORT).show(); 
       } else { 
        Toast.makeText(UploadActivity.this, "Sorry for inconvince server is down", Toast.LENGTH_SHORT).show(); 
       } 
      } 

      @Override 
      public void onFailure(Call<Result> call, Throwable t) { 
       progress.dismiss(); 
       Toast.makeText(UploadActivity.this, "Check your Internet connection", Toast.LENGTH_SHORT).show(); 
      } 
     }); 
    } 

注意: - 使用上面的文件POST例子,讓我知道,如果你堅持任何地方。

欲瞭解更多詳細信息請點擊this

編輯: -

對於您的情況下使用這樣的.....

@Multipart 
@POST("registration.php") 
Call<Signup> getSignupResponse(@Part("email") RequestBody email, 
           @Part("lname") RequestBody lname, 
           @Part("fname") RequestBody fname, 
           @Part("password") RequestBody password, 
           @Part MultipartBody.Part filename); 

,並使用改進的呼叫這樣的.. ...

File file = new File(path); 
    RequestBody emailRequest = RequestBody.create(MediaType.parse("text/plain"), email); 
    RequestBody lnameRequest = RequestBody.create(MediaType.parse("text/plain"), lname); 
    RequestBody fnameRequest = RequestBody.create(MediaType.parse("text/plain"), fname); 
    RequestBody passwordRequest = RequestBody.create(MediaType.parse("text/plain"), password); 

    MultipartBody.Part filePart = MultipartBody.Part.createFormData("file", file.getName(), RequestBody.create(MediaType.parse("image/*"), file)); 



     Call<Signup> call = qikGrubApi.upload(emailRequest, lnameRequest ,fnameRequest , passwordRequest, filePart); 

      call.enqueue(new Callback<Signup>() { 
       @Override 
       public void onResponse(Call<Signup> call, Response<Signup> response) { 
        progress.dismiss(); 
        if (response.isSuccessful()) { 
         if (response.body().getSuccess()) { 
          nextPage(response.body().getMessage()); 
         } else 
          Toast.makeText(UploadActivity.this, response.body().getMessage(), Toast.LENGTH_SHORT).show(); 
        } else { 
         Toast.makeText(UploadActivity.this, "Sorry for inconvince server is down", Toast.LENGTH_SHORT).show(); 
        } 
       } 

       @Override 
       public void onFailure(Call<Signup> call, Throwable t) { 
        progress.dismiss(); 
        Toast.makeText(UploadActivity.this, "Check your Internet connection", Toast.LENGTH_SHORT).show(); 
       } 
      }); 
     } 
+0

你的意思是說我需要爲圖片上傳創建另一個API,我無法上傳並傳遞帶有字符串參數的文件:(右 –

+0

你可以通過使用'RequestBody'變量並把你的字符串放在它裏面....在上面的例子中'tokenRequest'是'String' ..... – sushildlh

+0

謝謝,我知道了我想要的東西,真的很感謝你寶貴的時間再次謝謝:) –

相關問題