RestSharp codiert Leerzeichen in Formularparametern im Hauptteil als %20
, +
oder gar nicht, je nach Benutzereinstellung.
RestSharp codiert Leerzeichen in Formularparametern im Text als +
.
" "
) mit einem Pluszeichen ( "+"
)Wir rufen eine Drittanbieter-API auf, die erfordert, dass ein Parameterwert durch Leerzeichen getrennt wird (z. B. VALUE1 VALUE2 VALUE3
, codiert: param=VALUE1%20VALUE2%20VALUE3
). Bei Verwendung von RestSharp unterscheidet sich das Verhalten von Uri.EscapeDataString()
und HttpUtility.UrlEncode
:
Uri.EscapeDataString("ABC DEF")
> ABC%20DEF
HttpUtility.UrlEncode("ABC DEF")
> ABC+DEF
RestSharp sollte eine gewisse Art der Anpassung in diesem Teil unterstützen oder dem Benutzer ermöglichen, seine eigene (optionale) Escape-/Codierungs-/Bereinigungsfunktion zu implementieren, um das Standardverhalten zu überschreiben.
Die HTTP-Spezifikation application/x-www-form-urlencoded erwähnt zwar, dass Leerzeichen als +
codiert werden sollten, aber %20
folgt auch der Spezifikation, und nicht alle Systeme von Drittanbietern akzeptieren +
als Ersatz für ein Leerzeichen unabhängig von der Spezifikation.
Hinweis: Gibt es eine Problemumgehung, um den Formulartext als param=ABC%20DEF
zu codieren?
Es wäre schön, wenn Sie auch einen Vorschlag zur Behebung dieses Problems oder eine Pull-Anfrage machen könnten.
Ich bin gerade auch darauf gestoßen und habe gegen eine API verstoßen, die nur „%20“ und nicht „+“ für GET-Parameter bei einem REST-Aufruf akzeptiert, aber die Grundursache ist identisch.
Die naheliegende Lösung wäre, das Verhalten von EncodeParameter
irgendwie zu überschreiben, um die Verwendung von EscapeDataString
anstelle von UrlEncode
zu ermöglichen
Es gibt eine Reihe ausführlicher Threads zu Stack Overflow (z. B. https://stackoverflow.com/questions/602642/server-urlencode-vs-httputility-urlencode), aber es ist letztendlich unklar, was das richtige Verhalten tatsächlich ist. . und es wäre sehr praktisch, eine Möglichkeit zu haben, das auszuwählen, was Sie brauchen, anstatt immer UrlEncode
zu verwenden, was in einigen Fällen definitiv nicht das richtige Verhalten ist.
Verwenden Sie als Problemumgehung im Grunde nichts, was Parameters
setzt, und führen Sie dies manuell durch.
Ich denke über den besten Weg nach, dies zu implementieren ... wahrscheinlich eine IParameterEncoder
-Schnittstelle mit einem DefaultParameterEncoder
, das HttpUtility.UrlEncode(...)
aufruft, das als Standardimplementierung festgelegt ist, aber sein kann irgendwo überschrieben. Ist es sinnvoll, es in RestClient
, oder sollte es in Http
gehen, so wie hier die Eigenschaft IWebProxy
?
Ich denke, es wäre einfacher, es so zu haben:
public Func<string, string> Encoder { get; set; } = s => HttpUtility.UrlEncode(s);
Ich habe kein Bedürfnis nach einer Schnittstelle für eine einzelne Funktion.
@qJake so
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 Ja! Das wäre großartig. 👍
Wird in der nächsten Version veröffentlicht.