Hi Volkert,
Thanks for the test case, it helped me figure out what the problem was.
Basically, what Norbert said was 100% correct: the server code (Teapot) should
have specified the charset or encoding of the mime-type it was using (so
application/json;charset=utf-8 instead of just application/json).
However, I thought I had changed the default to be utf-8, so I was surprised it
was not picked up.
It turned out utf-8 was the default for reading/writing http messages and their
entities, but not so when manually constructing instances (like Teapot did).
In code,
json := '{''bank'':''Région Genève Rhône''}'.
entity := ZnEntity with: json type: 'application/json'.
response := ZnResponse ok: entity.
response encoder.
did not return a ZnUTF8Encoder but a ZnNullEncoder.
I changed that now.
===
Name: Zinc-HTTP-SvenVanCaekenberghe.428
Author: SvenVanCaekenberghe
Time: 2 May 2015, 7:09:55.832482 pm
UUID: 6376bd91-2a95-4265-bfff-e3c6626aee79
Ancestors: Zinc-HTTP-SvenVanCaekenberghe.427
Change ZnStringEntity>>#initializeEncoder to default to ZnUTF8Encoder unless
ZnDefaultCharacterEncoder is set
Change ZnEntityReader>>#readEntity to no longer use #withDefaultUtf8Decoder:
(and remove it)
Change ZnEntityWriter>>#writeEntity: to no longer use #withDefaultUtf8Encoder:
(and remove it)
Add ZnResponseTests>>#testDefaultUTF8Encoding
===
Name: Zinc-Tests-SvenVanCaekenberghe.226
Author: SvenVanCaekenberghe
Time: 2 May 2015, 7:10:12.331593 pm
UUID: 9010fbd6-bf9d-400e-b463-cb73920b79f6
Ancestors: Zinc-Tests-SvenVanCaekenberghe.225
Change ZnStringEntity>>#initializeEncoder to default to ZnUTF8Encoder unless
ZnDefaultCharacterEncoder is set
Change ZnEntityReader>>#readEntity to no longer use #withDefaultUtf8Decoder:
(and remove it)
Change ZnEntityWriter>>#writeEntity: to no longer use #withDefaultUtf8Encoder:
(and remove it)
Add ZnResponseTests>>#testDefaultUTF8Encoding
===
for now, in #bleedingEdge of Zinc HTTP Components.
HTH,
Sven
> On 01 May 2015, at 15:53, volkert <[email protected]> wrote:
>
> Here a stripped down example
>
> d := { 'bank' -> 'Région Genève Rhône'. } asDictionary.
>
> teapot := Teapot configure: {
> #defaultOutput -> #json.
> #port -> 8081.
> #debugMode -> true
> }.
>
> teapot
> GET: '/api/d' -> d;
> exception: KeyNotFound -> (TeaResponse notFound body: 'asd');
> start.
>
> (ZnEasy get: 'http://localhost:8081/api/d') entity string.
>
> Pharo 4.0 / Teapot
>
> BW,
> Volkert
>
>
>
> Am 01.05.2015 um 15:35 schrieb Sven Van Caekenberghe:
>>> On 01 May 2015, at 15:15, volkert <[email protected]> wrote:
>>>
>>> I thought UTF-8 is the default encoding in case JSON Documents, and so for
>>> the Content-Type: application/json.
>>>
>>> I added "setCharSetUTF8" this Teapot-Output and all works fine now. :-)
>> Fine, but I still think this is strange, it should work by default too.
>> But to understand what went wrong, I need an example (server+client) that I
>> can run.
>>
>>> Danke,
>>> Volkert
>>>
>>> Am 01.05.2015 um 14:20 schrieb Norbert Hartl:
>>>> You need to look at the headers of the request. I would assume the sender
>>>> sets an Content-Type: application/json without charset. In that moment it
>>>> is uncertain what has to be done because the server needs to assume what
>>>> charset it might be and this tasks seldomly works out good.
>>>> In order to make it work set a content type of your entity this way
>>>>
>>>> ZnMimeType applicationJson setCharSetUTF8
>>>>
>>>> Now you send a Content-Type of application/json;charset=utf-8 and the
>>>> server knows which character decoder to use. That should be it. So please
>>>> always assign a char set to your sending data to make it more reliable
>>>> what happens on the other end.
>>>>
>>>> hope this helps,
>>>>
>>>> Norbert
>>>>> Am 01.05.2015 um 14:13 schrieb volkert <[email protected]>:
>>>>>
>>>>> I tried ZnClient new get: 'http://<removed>/api/atm/801813'; yourself and
>>>>> got.
>>>>>
>>>>> <fdchdjab.png>
>>>>>
>>>>> This is the Doc i see in Firefox.
>>>>>
>>>>> <fceagiec.png>
>>>>>
>>>>> The JSON is served with ZnServer / Teapot. ;-)
>>>>>
>>>>> Volkert
>>>>>
>>>>>
>>>>> Am 01.05.2015 um 12:21 schrieb Sven Van Caekenberghe:
>>>>>> Hi Volkert,
>>>>>>
>>>>>> Tip 1: use ZnClient and inspect the response in detail, more
>>>>>> specifically to see whether the response content type specifies the
>>>>>> encoding.
>>>>>>
>>>>>> ZnClient new get: '
>>>>>> http://
>>>>>> <removed>/api/atm/801813'; yourself.
>>>>>>
>>>>>> Tip 2: you could try to force override the default encoding using
>>>>>> ZnDefaultCharacterEncoder (see the class comment).
>>>>>>
>>>>>> But recent Zn code defaults to UTF8 (see #withDefaultUTF8Decoding: and
>>>>>> #withDefaultUTF8Encoding:). So I am curious to see the response headers.
>>>>>>
>>>>>> HTH,
>>>>>>
>>>>>> Sven
>>>>>>
>>>>>>
>>>>>>> On 01 May 2015, at 11:54, volkert <[email protected]>
>>>>>>> wrote:
>>>>>>>
>>>>>>> Dear all,
>>>>>>>
>>>>>>> i am trying to get a JSON Document with ZnEasy. The Document is UTF-8
>>>>>>> encoded.
>>>>>>>
>>>>>>> (ZnEasy get: '
>>>>>>> http://
>>>>>>> <removed>/api/atm/801813') entity string.
>>>>>>> <gccacjeh.png>
>>>>>>>
>>>>>>> Any hints?
>>>>>>>
>>>>>>> Volkert
>>>>>>>
>>>>>>>
>>>>>>>
>>
>
>