2016-08-29 83 views
5

Potrzebuję kodować jako ładunki HTTP UTF-8 wysyłane przy użyciu metody JsonValue.Request dostawcy typu JSON.Jak skonfigurować dostawcę typu F # JSON, aby korzystać z UTF-8 dla żądań POST?

Żądanie pozwala na określenie nagłówków HTTP, ale dostawca typu JSON dba o ustawienie nagłówka Content-Type jako "application/json" bez określania kwalifikatora "charset". Jeśli spróbuję ustawić typ zawartości osobiście, otrzymam zduplikowaną wartość nagłówka (co spowoduje błąd). I tylko „application/json” następujący kod wybiera defauls Kodowanie:

let getEncoding contentType = 
    let charset = charsetRegex.Match(contentType) 
    if charset.Success then 
     Encoding.GetEncoding charset.Groups.[1].Value 
    else 
     HttpEncodings.PostDefaultEncoding 

PostDefaultEncoding jest to ISO-8859-1, który nie nadaje się w naszym scenariuszu.

Jakieś pojęcie, w jaki sposób PostDefaultEncoding może zostać nadpisany dla ładunku JsonValue.Request?

Odpowiedz

2

Myślę, że metoda JsonValue.Request jest po prostu wygodnym pomocnikiem, który obejmuje najczęstsze scenariusze, ale niekoniecznie zapewnia całą moc potrzebną do wykonywania arbitralnych żądań. (To powiedziawszy, UTF-8 brzmi jak bardziej rozsądnym domyślnie).

Najbardziej ogólnym F funkcja # danych jest Http.Request, który pozwala na przesyłanie danych w dowolny sposób:

let buffer = System.Text.Encoding.UTF8.GetBytes "" 
Http.RequestString 
    ("https://httpbin.org/post", 
    httpMethod="POST", 
    body=HttpRequestBody.BinaryUpload buffer) 

Tak więc, jeśli zastąpić "" z yourJsonValue.ToString(), powinno to wysłać żądanie z treścią kodowaną w UTF-8.

+0

Dziękuję Tomas, za pomocą Http.Request zdecydowanie rozwiązać. Zamiast tego użyłem Http.fs, ale z twoją sugestią mogłem osiągnąć wszystko za pomocą jednej biblioteki. Ale byłoby miło nieco poprawić JsonValue.Request, ponieważ wyeliminowałoby to potrzebę całej tej ceremonii wokół uzyskania bufora ciągów, określania ciała żądania HTTP itp. Jednym ze sposobów na to jest uszanowanie nagłówka Content-Encoding. Po określeniu może wybrać kodowanie ładunku z pominięciem domyślnego ISO-8859-1. –