RestSharpは、ユーザーの好みに応じて、本文のフォームパラメータのスペースを%20
、 +
、またはまったくエンコードしません。
RestSharpは、本文のフォームパラメータのスペースを+
としてエンコードします。
" "
)をプラス文字( "+"
)でエンコードします。パラメータ値をスペースで区切る必要があるサードパーティの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
としてエンコードするための回避策はありますか?
これを修正するための提案やプルリクエストも考えていただければ幸いです。
私もこれに遭遇し、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
に入れるべきですか?
私はそれをこのようにする方が簡単だと思います:
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はい! それは素晴らしいでしょう。 👍
次のバージョンでリリースされます。