Wie kann ich HTTP-Anfrage-Header für die Inhaltsverhandlung in einem Mashaller verwenden?

9

Meine App unterstützt Protobuf- und JSON-Serialisierung. Für die JSON-Serialisierung verwende ich com.trueaccord.scalapb.json.JsonFormat , meine dtos werden aus Proto-Definitionen generiert.

Der com.trueaccord Serializer umschließt Optionstypen zu JSON-Objekten, was Probleme für einige Clients verursacht, so dass ich org.json4s unterstützen kann, ohne die bestehenden Clients zu bremsen.

Ich möchte einen Serializer basierend auf einem benutzerdefinierten HTTP-Header namens JFORMAT auswählen können. Die Idee ist, dass, wenn dieser Header gesendet wird, ich json4s verwenden werde, sonst werde ich den trueaccord Serializer verwenden.

Ich habe es geschafft, einen Unmarshaller zu erstellen, der einen Anfrage-Serializer basierend auf einem Header-Wert auswählen kann:

%Vor%

Ich möchte das gleiche mit meinem Marshaller machen, den ich mit Marshaller.oneOf verwende und die JSON-Handhabung sieht so aus:

%Vor%

Gibt es eine Möglichkeit, einen Mashaller zu konstruieren, der die HTTP-Header der Anfrage kennt? Die Akka-HTTP-Dokumente haben keine Beispiele und ich kann den PredefinedToRequestMarshaller nicht verstehen.

Muss ich mehrere Marshaller irgendwie kombinieren oder kann ich während der Anfrage-Serialisierung, die ich später im Marshaller verwenden kann, einige Metadaten an einen Kontext anhängen? Ich möchte vermeiden, an mein dto wenn möglich meta anzufügen oder einen benutzerdefinierten Inhaltstyp wie application/vnd.api+json

zu verwenden

Es gibt viele andere nützliche Informationen, die ich aus der Anfrage verwenden könnte, wenn ich die Antwort wie Accept-Encoding formatiere, benutzerdefinierte Header wie eine eindeutige Anforderungs-ID, um eine Korrelations-ID zu erstellen. Ich könnte JSONP-Unterstützung hinzufügen, indem ich die callback -Abfrage lese Parmeter usw.

Zur Klarstellung: Ich brauche eine Lösung, um den Mashaller, eine Unterklasse davon oder eine benutzerdefinierte Version zu verwenden, die durch eine Factory-Methode oder möglicherweise mehrere verkettete Marshaller erstellt wurde. Marshaller.withFixedContentType verwendet bereits den Header Accept , also muss es einen Weg geben. Ich habe eine zusätzliche Prämie hinzugefügt, um eine Lösung für eine bestimmte Herausforderung zu belohnen. Ich habe Hacks und Workarounds und ich habe die Frage gestellt, weil ich eine saubere Lösung brauche, um ein bestimmtes Szenario zu lösen.

    
Jeno Laszlo 04.07.2017, 05:02
quelle

1 Antwort

0

Benutzerdefinierte Marshaller Abschnitt erwähnt Marshaller.oneOf überladene Methoden, das scheint zu sein, was Sie wollen:

  

Helfer zum Erstellen eines "Super-Marshaller" aus einer Reihe von   "Sub-Marshaller". Content-Negotiation bestimmt, welche   "Sub-Marshaller" kann schließlich den Job machen.

Die Marshaller Begleitobjekt hat viele Methoden, die ein Seq[HttpHeader] erhalten. Sie können auch in ihre Implementierungen schauen.

Ich habe nicht die Zeit, selbst in den Quellcode zu schauen, aber wenn das nicht genug ist, um Sie auf den richtigen Weg zu bringen, lassen Sie es mich wissen.

Bearbeiten :

Wie wäre es?

%Vor%     
Abhijit Sarkar 06.07.2017 07:00
quelle