1 回答

TA貢獻2039條經驗 獲得超8個贊
數據準備部分代碼對我來說看起來不錯。但是您用于 PUT 請求的 URL 是錯誤的。
正如你在問題中提到的
在發布整個數據之前,我需要請求服務器上傳我的畫布簽名。所以服務器會回復兩個網址
該 API 返回 2 個 URL。從這 2 個 URL 中,您選擇第二個 URL 來上傳文件。我希望到目前為止它在 Android 部分工作得很好。
現在,是時候上傳文件了。您已從 API 獲得了用于上傳文件的完全限定 URL。只需將您的網址替換BASE_URL
為您獲得的第二個網址即可。@Path("Put_path")
您應該使用注釋,而不是使用@Url
注釋。就像下面這樣,
@PUT() /* remove "{Put_path}" parameter*/
Call<Object> aws_upload(
@Url String path, /* replace @Path() with @Url */
@Header("auth") String auth,
@Header("Content-Length") long length,
@Query("x-amz-acl") String x_amz,
@Query("AWSAccessKeyId") String awskey,
@Query("Expires") String Expires,
@Query("Signature") String Awssignature,
@Body RequestBody image);
解釋
怎么運行的?
假設您想訪問以下 URL
https://api.example.com/users/{user_id}
在 Retrofit 中,您聲明 aBASE_URL并為其賦值 value https://api.example.com/。在您的服務接口文件中,您聲明一個如下所示的方法
@GET("users/{user_id}")
Call<UserModel> fetchUserById(@Path("user_id") int userId);
每當你調用上面的方法時,它都會構建一個類似的 URL
https://api.example.com/users/100
從上面的示例中我們了解到@GET(),@POST()、@PUT()、@DELETE()等方法接受部分 URL,Retrofit 客戶端將為您生成完全限定的 URL。
如果您想從 Retrofit 客戶端訪問 BASE_URL 以外的 URL,該怎么辦?
在這種情況下,我們使用Retrofit的@Url注解。它將完全替換當前請求的 BASE_URL。
我將演示與上面相同的示例,但帶有@Url注釋。
@GET() // notice the difference you don't need to pass partial path here
Call<UserModel> fetchUserById(@Url String url);
這次我將在調用方法或 Activity/Fragment 中硬編碼完全限定的 URL。
String overrideUrl = "https://api.example.com/users/200"; // prepare fully qualified url
SomeServiceInterface service = ...
Call<UserModel> call = service.fetchUserById(overrideUrl); // pass it to method as an argument
call.enqueue(/* callback implementation here */);
添加回答
舉報