1 回答

TA貢獻(xiàn)2039條經(jīng)驗 獲得超8個贊
數(shù)據(jù)準(zhǔn)備部分代碼對我來說看起來不錯。但是您用于 PUT 請求的 URL 是錯誤的。
正如你在問題中提到的
在發(fā)布整個數(shù)據(jù)之前,我需要請求服務(wù)器上傳我的畫布簽名。所以服務(wù)器會回復(fù)兩個網(wǎng)址
該 API 返回 2 個 URL。從這 2 個 URL 中,您選擇第二個 URL 來上傳文件。我希望到目前為止它在 Android 部分工作得很好。
現(xiàn)在,是時候上傳文件了。您已從 API 獲得了用于上傳文件的完全限定 URL。只需將您的網(wǎng)址替換BASE_URL
為您獲得的第二個網(wǎng)址即可。@Path("Put_path")
您應(yīng)該使用注釋,而不是使用@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);
解釋
怎么運(yùn)行的?
假設(shè)您想訪問以下 URL
https://api.example.com/users/{user_id}
在 Retrofit 中,您聲明 aBASE_URL并為其賦值 value https://api.example.com/。在您的服務(wù)接口文件中,您聲明一個如下所示的方法
@GET("users/{user_id}")
Call<UserModel> fetchUserById(@Path("user_id") int userId);
每當(dāng)你調(diào)用上面的方法時,它都會構(gòu)建一個類似的 URL
https://api.example.com/users/100
從上面的示例中我們了解到@GET(),@POST()、@PUT()、@DELETE()等方法接受部分 URL,Retrofit 客戶端將為您生成完全限定的 URL。
如果您想從 Retrofit 客戶端訪問 BASE_URL 以外的 URL,該怎么辦?
在這種情況下,我們使用Retrofit的@Url注解。它將完全替換當(dāng)前請求的 BASE_URL。
我將演示與上面相同的示例,但帶有@Url注釋。
@GET() // notice the difference you don't need to pass partial path here
Call<UserModel> fetchUserById(@Url String url);
這次我將在調(diào)用方法或 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 */);
添加回答
舉報