首页 > 解决方案 > 如果 url 字符串包含“~”符号,则改造调用错误的 url 导致 404 错误

问题描述

我已经创建了改造客户端和 api 接口,但改造跳过了 url 中的某些部分并调用了错误的 url

这是完整的网址 http://192.168.0.201/~amol/eflbudget/budgetmanagements/test

改造调用 http://192.168.0.201/budgetmanagements/test/的 url

这会导致 404 错误

//here is my retrofit client code 

public static Retrofit getClient() {
    HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
    interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
    OkHttpClient client = new OkHttpClient.Builder()
            .addInterceptor(interceptor)
            .build();

    if (retrofit != null) {
        return retrofit;
    }

    Gson gson = new GsonBuilder()
            .setLenient()
            .create();

    retrofit = new Retrofit.Builder()
            .baseUrl("http://192.168.0.201/")
            .addConverterFactory(GsonConverterFactory.create(gson))
            .client(client)
            .build();

    return retrofit;
}

// below is api call
@Multipart
@POST("/~amol/eflbudget/budgetmanagements/test/")
Call<ResponseBody> postMail(
        @Part("user_id") RequestBody userId,
        @Part("lead_id") RequestBody leadId,
        @Part("to") RequestBody to,
        @Part("cc_to") RequestBody ccId,
        @Part("template_id") RequestBody tempId,
        @Part("sender") RequestBody senderId,
        @Part("subject") RequestBody subject,
        @Part("message") RequestBody message,
        @Part MultipartBody.Part file
);

预期的 api 网址:http: //192.168.0.201/~amol/eflbudget/budgetmanagements/test

实际网址:http: //192.168.0.201/budgetmanagements/test/

这里 /~amol/eflbudget url 中的这一部分被忽略
了,有人可以在这里提出建议吗?

标签: androidretrofit

解决方案


RFC中包含以下字符:

无保留字符

URI 中允许但没有保留用途的字符称为未保留字符。这些包括大写和小写字母、十进制数字、连字符、句点、下划线和波浪号。

  unreserved  = ALPHA / DIGIT / "-" / "." / "_" / "~"

伯纳斯-李等人。标准跟踪 [第 13 页]

RFC 3986 URI 通用语法 2005 年 1 月

在用相应的百分比编码的 US-ASCII 八位字节替换未保留字符方面不同的 URI 是等效的:它们标识相同的资源。然而,URI 比较实现并不总是在比较之前执行规范化(参见第 6 节)。为了保持一致性,在 ALPHA(%41-%5A 和 %61-%7A)、DIGIT (%30-%39)、连字符 (%2D)、句点 (%2E)、下划线 (% 5F) 或波浪号 (%7E) 不应由 URI 生产者创建,并且当在 URI 中找到时,应由 URI 规范器将其解码为相应的未保留字符。


推荐阅读