Retrofit Getリクエストに特殊文字(^)レポート400エラー


またたく間にまた1ヶ月で、振り返ってすでに2年を過ぎて、ああ.
パスワードを変更してappにログインすると、ログインできないことに気づいて直接エラーを報告し、急いでコードlogを表示します.
09-05 12:50:29.909 13653-13653/com.yiche.autoreport W/System.err: retrofit2.adapter.rxjava.HttpException: HTTP 400
        at retrofit2.adapter.rxjava.OperatorMapResponseToBodyOrError$1.onNext(OperatorMapResponseToBodyOrError.java:43)
        at retrofit2.adapter.rxjava.OperatorMapResponseToBodyOrError$1.onNext(OperatorMapResponseToBodyOrError.java:38)
        at retrofit2.adapter.rxjava.RxJavaCallAdapterFactory$RequestArbiter.request(RxJavaCallAdapterFactory.java:162)
        at rx.internal.operators.OperatorSubscribeOn$1$1$1.request(OperatorSubscribeOn.java:80)
        at rx.Subscriber.setProducer(Subscriber.java:211)
        at rx.internal.operators.OperatorSubscribeOn$1$1.setProducer(OperatorSubscribeOn.java:76)
        at rx.Subscriber.setProducer(Subscriber.java:205)
        at retrofit2.adapter.rxjava.RxJavaCallAdapterFactory$CallOnSubscribe.call(RxJavaCallAdapterFactory.java:141)
        at retrofit2.adapter.rxjava.RxJavaCallAdapterFactory$CallOnSubscribe.call(RxJavaCallAdapterFactory.java:127)
        at rx.Observable$2.call(Observable.java:233)
        at rx.Observable$2.call(Observable.java:225)
        at rx.Observable.unsafeSubscribe(Observable.java:8644)
        at rx.internal.operators.OperatorSubscribeOn$1.call(OperatorSubscribeOn.java:94)
        at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:55)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:423)
        at java.util.concurrent.FutureTask.run(FutureTask.java:237)
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:154)
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:269)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
        at java.lang.Thread.run(Thread.java:818)
よくわからなかった!
次に、HttpLoggingInterceptor印刷の要求ロゴを見てurlパラメータは以下の通りであることが分かった.
║ --> GET https://xxxxxx/index/login?username=xxx&password=ssd123$%^ http/1.1
パラメータに符号化されていないpasswordはssd 123$%^,"^"文字がurl符号化されていないことを覚えています.retrofitのデフォルトでは、規則に合わないパラメータvalueが自動的に符号化されているのを覚えています.
ドキュメントを参照してください.
Retrofitでは@Query,@QueryMap,@QueryNameなどのように自動的にエンコードされますが、
注記は次のように定義されます.
@Documented
@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface QueryMap {
    boolean encoded() default false;
}

public abstract boolean encoded
Specifies whether the parameter name and value are already URL encoded.
Default:
false
falseは、特殊文字がurl符号化されていることを示します.
ここで解決策がすでにあるのを見て、encoded=trueで、それから自分で符号化して、私はencoded=trueを設定して、後でlogを見て、規則に合わない要求パラメータはやはり符号化します.
/**
 *   
 */
@GET( BASE_URL + "index/login" )
Observable< LoginResult > requestLogin( @QueryMap(encoded = true) Map< String, String > params );

final Map< String, String > paramsMap = new ParamsProvider.Builder().
        append( "username", account ).
        append( "password",URLEncoded(password) ).
        build();




ここで疑問なのは、なぜ自動符号化時に「^」文字を符号化しなかったのか、おかしいことです.