%3F而不是我的Retrofit网址中的问号

ale*_*sov 14 android retrofit2

我正在尝试将图片发送到服务器.我的网址包含有关手机的一些参数:

api/v2/user/email_register%3F_height=1184&_target=android/2&_width=768 
Run Code Online (Sandbox Code Playgroud)

这是工作变体:

api/v2/user/email_register?_height=1184&_target=android/2&_width=768
Run Code Online (Sandbox Code Playgroud)

(没有刺激%3?代码)

另外,我试图在@Body中传递我的照片:

@POST("/{url}")
Observable<UpdateUserInfoPayload> register(
        @Header("x-device-id") String deviceId,
        @Body RequestBody requestBody,
        @Path(value = "url", encoded = true) String  method
);
Run Code Online (Sandbox Code Playgroud)

使用MultipartBuilder创建它:

protected RequestBody buildAvatar(String avatarPath) {


 MultipartBuilder builder = new MultipartBuilder()
  .type(MultipartBuilder.FORM)
  .addFormDataPart(ParkApiUrl.PARAM_USER_NAME, name.getText().toString())
  .addFormDataPart(ParkApiUrl.PARAM_USER_SECOND_NAME, lastName.getText().toString())
  .addFormDataPart(ParkApiUrl.PARAM_EMAIL, email.getText().toString())
  .addFormDataPart(ParkApiUrl.PARAM_USER_ENCODED_PASSWORD,
   PasswordUtils.encodePassword(encodePassword()))
  .addFormDataPart(ParkApiUrl.PARAM_USER_GENDER,
   male.isChecked() ? EmailProfile.GENDER_MALE : EmailProfile.GENDER_FEMALE)
  .addFormDataPart(ParkApiUrl.PARAM_PARSE_ID,
   ParseInstallation.getCurrentInstallation().getObjectId());


 File file = new File(avatarPath);;
 int size = (int) file.length();
 byte[] bytes = new byte[size];
 try {
  BufferedInputStream buf = new BufferedInputStream(new FileInputStream(file));
  buf.read(bytes, 0, bytes.length);
  buf.close();
  builder.addFormDataPart("photo", "image.jpg", RequestBody.create(MEDIA_TYPE_JPG, bytes));
 } catch (IOException e) {
  e.printStackTrace();
 }
 return builder.build();
}
Run Code Online (Sandbox Code Playgroud)

这就是为什么我无法使用例如:

@FieldMap Map<String, String> params
Run Code Online (Sandbox Code Playgroud)

在那里传递我的参数,因为@FieldMap需要@FormUrlEncoded而我无法用@FormUrlEncoded制作@Body请求.

1)如何从我的URL字符串中删除%3F?(外部改造一切都很好!)

2)有没有简单的方法来发送图片?

UPD: < - 403 当我使用@Field注释时禁止使用https://api.example.com/api/v2/user/5984/validate_password:

@FormUrlEncoded
@POST("/{url}")
Observable<BooleanResponse> validatePassword(
        @Header("x-device-id") String deviceId,
        @Field(ParkApiUrl.PARAM_USER_ENCODED_PASSWORD) String password,
        @Field(ParkApiUrl.PARAM_HEIGHT) String height,
        @Field(ParkApiUrl.PARAM_WIDTH) String width,
        @Field(ParkApiUrl.PARAM_TARGET) String target,

        @Path(value = "url", encoded = true) String  method
);
Run Code Online (Sandbox Code Playgroud)

当我像这样使用它时,一切都有效:

@FormUrlEncoded
    @POST("/api/v2/user/5984/validate_password?_height=1184&_target=android%2F2&_width=768&_user_id=5984") //full url
    Observable<BooleanResponse> validatePassword(
            @Header("x-device-id") String deviceId,
            @Field(ParkApiUrl.PARAM_USER_ENCODED_PASSWORD) String password
    );
Run Code Online (Sandbox Code Playgroud)

我想要删除%3F或学习如何在POST请求中使用Field而不获取FORBIDDEN

Jes*_*son 4

Retrofit 不允许您将查询字符串放入路径中。看看@QueryMap,它就是为此而设计的。

  • 我还是想把这个%3F去掉,打个问号。有任何想法吗? (4认同)