第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何使用二進(jìn)制形式的 Retrofit 上傳圖像?

如何使用二進(jìn)制形式的 Retrofit 上傳圖像?

汪汪一只貓 2024-01-28 17:33:14
我正在開發(fā)一個 Android 應(yīng)用程序,它發(fā)布一些用戶輸入的數(shù)據(jù)和用戶簽名(使用簽名板捕獲簽名并將其轉(zhuǎn)換為 bmp 文件)?,F(xiàn)在,在發(fā)布整個數(shù)據(jù)之前,我需要請求服務(wù)器上傳我的畫布簽名。所以服務(wù)器將回復(fù)兩個 url(參考圖片 1),分別是 put url 和 get url 現(xiàn)在我必須使用 PUT url 上傳簽名圖像文件,整個過程通過郵遞員成功,但我無法在 Android 應(yīng)用程序上實現(xiàn)。Put URl 的主體是二進(jìn)制的,我選擇一些隨機(jī)圖像文件。僅供參考,請參閱隨附的屏幕截圖Retrofit retrofit_image_upload=new Retrofit.Builder()                                        .baseUrl(Aws_url) // base url retrive using Uri class using uri.getAuthority and concat with "https:/"                                        .addConverterFactory(GsonConverterFactory.create())                                        .build();                ByteArrayOutputStream stream=new ByteArrayOutputStream();                signature.compress(Bitmap.CompressFormat.PNG,100,stream);                byte[] byteArray=stream.toByteArray();                final RequestBody requestBody=RequestBody.create(MediaType.parse("application/octet-stream"),byteArray);現(xiàn)在調(diào)用api并傳遞數(shù)據(jù)                                Call<Object> image_upload_call= null;                                try {                                    image_upload_call = final_upload.aws_upload(path,auth,requestBody.contentLength(),x_amz_acl,AWSAccessKeyId,Expires,Signature_aws,requestBody);                                } catch (IOException e) {                                    e.printStackTrace();                                }圖片上傳接口    @PUT("{Put_path}")    Call<Object> aws_upload(@Path("Put_path") String path,                            @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);}當(dāng)我使用此代碼設(shè)置服務(wù)器不接受來自 Android 應(yīng)用程序的文件,響應(yīng)是錯誤代碼 403,當(dāng)我嘗試從郵遞員軟件上傳圖像文件時,它工作正常。那么我該如何將其實現(xiàn)到 Android 應(yīng)用程序中呢?
查看完整描述

1 回答

?
largeQ

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 */);


查看完整回答
反對 回復(fù) 2024-01-28
  • 1 回答
  • 0 關(guān)注
  • 205 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號