1 回答
TA贡献2039条经验 获得超7个赞
数据准备部分代码对我来说看起来不错。但是您用于 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 */);
添加回答
举报