2016-08-03 28 views
0

Ich arbeite an einer asp.net MVC Web-Anwendung, und ich bin mit einer 3rd Party API integrieren. jetzt die 3rd Party API, erfordert folgende für das JSON-Objekt: -Korrekte Inhaltstyp Header ist ich bin Upload von URL-codierte Zeichenfolge mit Webclient mit UTF8 Codierung

  • URL-Codierung das JSON-Objekt. der Lage sein, Werte zu vermitteln wie 500%600, 123%456 ...
  • UTF8-Codierung verwenden zu können, nicht-ASCII-Zeichen zu übergeben, wie £, ¬ ..

, so habe ich die folgende WebClient()UploadString() Verfahren, die das übergebene jSON-Objekt ist und UTF8-Codierung werden url kodieren: -

using (WebClient wc = new WebClient()) 
       { 
        string url = currentURL + "resources?AUTHTOKEN=" + pmtoken; 
        Uri uri = new Uri(url); 
        wc.Encoding = System.Text.Encoding.UTF8; 
        wc.Headers.Add(HttpRequestHeader.ContentType, "application/x-www-form-urlencoded"); 

        var urlencodedData= HttpUtility.UrlEncode(data); 
        crudoutput = wc.UploadString(uri, "INPUT_DATA=" +urlencodedData); 
       } 

so in meinem Fall hat ich beide uRL-codierten Daten und UTF8-Codierung ist mit .. so nicht sicher, warum Inhaltstyp-Header i verwendet werden soll, ?? ist die, die ich richtig verwende: -

"application/x-www-form-urlencoded"); 

oder ich muss UTF8 Codierung in ihm angeben?

Antwort

1

Die Übertragungscodierung ist bereits mit der Eigenschaft Encoding des Webclients festgelegt. Einige der UTF-8-spezifischen Zeichen erfordern jedoch möglicherweise bestimmte Transformationen basierend auf der Codierung. Aus diesem Grund hat die UrlEncode Methode eine Überladung, die eine Codierung akzeptiert.

Sie einfach diese Methode wie folgt verwenden:

var urlencodedData = HttpUtility.UrlEncode(data, System.Text.Encoding.UTF8); 

Der Inhaltstyp Sie ausgewählten Steuerelemente nur, wie der Inhalt Nutzlast interpretiert wird. Wenn Sie Schlüssel- und Wertepaare mit URL-codierten Werten verwenden möchten, verwenden Sie den Inhaltstyp application/x-www-form-urlencoded.

Wenn Sie jedoch eine JSON-Nutzlast übertragen möchten, sollten Sie den Inhaltstyp application/json verwenden, wie von RFC 4627 angegeben. Falls Sie sich dafür entscheiden, können Sie die URL-Kodierung und die "INPUT_DATA=" weglassen.

+0

Basierend auf meinem Test, wenn ich den Content-Type-Header als "Application/JSON" angeben und ich nicht explizit URL-Codierung mein JSON, dann wenn mein JSON-Objekt Werte wie 500% 600 enthalten, werden sie sein gespeichert als 500'0 innerhalb des externen Systems, was bedeutet, dass API ist irgendwie URL entschlüsseln das Json-Objekt, sobald sie es empfangen ... so, warum ich wählte Dinge zu tun, wie ich in meinem Code gezeigt .. jetzt, was Sie sagen ist die korrekte appraoch unter der Annahme, die externe API wird auf den Inhaltstyp schauen und die Entschlüsselung entsprechend ... –

+0

.... aber die externe API haben einige Probleme ... so ist meine appraoch gültig? oder könnte Probleme verursachen? auch die INPUT_DATA ist nur ein Teil der gesamten JSON-Zeichenfolge, es ist kein Schlüssel & Wert-Paare, also muss ich es hinzufügen .. und wenn ich es entferne, bekomme ich einen Fehler von der externen API, dass die JSON-Zeichenfolge ungültig ist !! –

+1

Nun immer vorausgesetzt, dass Ihr Counter-Teil Anforderungen gemäß den Standards behandelt. Der 'INPUT_DATA =' ist ** nie ** Teil der JSON-Daten. JSON-Daten identifizieren Schlüssel-Wert-Paare nach 'Schlüssel: Wert' und senden immer Objekte wie:' {Schlüssel: Wert, Schlüssel: Wert} 'Der' INPUT_DATA = 'ist der Schlüssel der Formularkodierung. Wenn Ihr Ziel dies nur unterstützt, müssen Sie es verwenden. – Nitram