Restsharp: スペース文字( "")を "%20" vs "+"としてエンコード

作成日 2018年07月09日  ·  7コメント  ·  ソース: restsharp/RestSharp

予想される行動

RestSharpは、ユーザーの好みに応じて、本文のフォームパラメータのスペースを%20+ 、またはまったくエンコードしません。

実際の動作

RestSharpは、本文のフォームパラメータのスペースを+としてエンコードします。

問題を再現する手順

  1. POSTリクエストを作成する
  2. 本文のキー/値パラメーターを追加し、値にスペースを含めます
  3. 結果のHTTP呼び出しは、スペース文字( " " )をプラス文字( "+" )でエンコードします。

仕様

  • バージョン:105.2.3.0
  • プラットフォーム:ASP.NET Webアプリケーション(.NET v4.6.2)

ソースリファレンス

https://github.com/restsharp/RestSharp/blob/1805996d6f93226cdbf9dd1cc50b90423c1456c7/RestSharp/Http.cs#L322

説明

パラメータ値をスペースで区切る必要があるサードパーティのAPIを呼び出しています(例: VALUE1 VALUE2 VALUE3 、エンコード: param=VALUE1%20VALUE2%20VALUE3 )。 RestSharpを使用する場合、 Uri.EscapeDataString()HttpUtility.UrlEncodeの動作は異なります。

Uri.EscapeDataString("ABC DEF")
> ABC%20DEF
HttpUtility.UrlEncode("ABC DEF")
> ABC+DEF

RestSharpは、この部分で何らかのカスタマイズをサポートするか、デフォルトの動作をオーバーライドするために、ユーザーが独自の(オプションの)エスケープ/エンコード/サニタイズ機能を実装できるようにする必要があります。

HTTP application / x-www-form-urlencoded仕様では、スペースは+としてエンコードする必要があると記載されていますが、 %20も仕様に従い、すべてのサードパーティシステムが+を受け入れるわけではありません。仕様に関係なく、スペース文字の代わりに

注意:フォーム本体をparam=ABC%20DEFとしてエンコードするための回避策はありますか?

全てのコメント7件

これを修正するための提案やプルリクエストも考えていただければ幸いです。

私もこれに遭遇し、REST呼び出しのGETパラメーターに対して「+」ではなく「%20」のみを受け入れるAPIに違反しましたが、根本的な原因は同じです。

明らかな解決策は、 EncodeParameterの動作をオーバーライドして、 UrlEncode EscapeDataStringを使用できるようにすることです。

これについては、スタックオーバーフロー(https://stackoverflow.com/questions/602642/server-urlencode-vs-httputility-urlencodeなど)に多数の広範なスレッドがありますが、最終的に正しい動作が実際に何であるかは不明です。 。そして、常にUrlEncodeを使用するのではなく、必要なものを選択する方法があると非常に便利です。これは、場合によっては間違いなく正しい動作ではありません。

回避策として、基本的に、 Parametersを設定するものは使用せず、手動で実行してください。

私はこれを実装するための最良の方法について考えています...おそらくデフォルトの実装として設定されているHttpUtility.UrlEncode(...)を呼び出す$ DefaultParameterEncoderを備えたIParameterEncoderインターフェイスですが、どこかで上書きされました。 RestClientに入れるのは理にかなっていますか、それともIWebProxyプロパティがここにあるようにHttpに入れるべきですか?

https://github.com/restsharp/RestSharp/blob/1805996d6f93226cdbf9dd1cc50b90423c1456c7/RestSharp/Http.cs#L220

私はそれをこのようにする方が簡単だと思います:

    public Func<string, string> Encoder { get; set; } = s => HttpUtility.UrlEncode(s);

単一の機能のためのインターフェースの必要性を感じません。

@qJakeこのように
https://github.com/restsharp/RestSharp/commit/62e95bd03a0c64ac3933b648be4ee18d6c220ad7#diff -fbb0205ba27639004072c041141c4459R133

        /// <summary>
        /// Allows to use a custom way to encode parameters
        /// </summary>
        /// <param name="encoder">A delegate to encode parameters</param>
        /// <example>client.UseUrlEncoder(s => HttpUtility.UrlEncode(s));</example>
        /// <returns></returns>
        public IRestClient UseUrlEncoder(Func<string, string> encoder)
        {
            Encode = encoder;
            return this;
        }

@alexeyzimarevはい! それは素晴らしいでしょう。 👍

次のバージョンでリリースされます。

このページは役に立ちましたか?
0 / 5 - 0 評価