Když použijete POST, dělá ta metoda klasický formulářový upload souboru. Když teda odstraníte ten váš Content-Type a necháte metodu vložit tam správný. Otázkou samozřejmě je, zda cílové API očekává formulářový upload souboru.
Žádný prohlížeč neodesílá formuláře metodou PUT, takže pro tuto metodu není upload souboru nijak definován. Podle vašeho výstupu metoda dělá to, že v těle požadavku odešle obsah souboru. Takové chování dává smysl.
Podle vašeho popisu je to ale klasické RESTové API, které POSTem vytváří nový záznam a PUTem přepisuje existující záznam. Takové API bude určitě fungovat s tím, že dostane v těle požadavku obsah – tak, jak to máte s tím curl. teoreticky tam může být nějaké berlička, že to bude přes POST akceptovat i upload souboru, aby se to dalo otestovat i v prohlížeči, ale to byste si musel ověřit, že to tak opravdu funguje (třeba aspoň tím curl). Ale spíš bych se na to vykašlal a posílal bych data normálně v těle požadavku.
A pokud tam posíláte XML, doporučoval bych Content-Type nastavovat na application/xml (nebo text/xml). Server teď asi
Content-Type ignoruje – když mu pošlete, že je to formulář a místo toho pošlete XML, on to akceptuje. Ale třeba to bude v nějaké příští verzi opravené a ten váš rozbitý kód pak přestane fungovat.
Převedením souboru na stream a jeho odesláním se problém vyřešil, ale teda...
Když jste si uvědomil, že nechcete dělat formulářový upload souboru, ale poslat data, opravil jste kód, aby to skutečně dělal, a ono to funguje. Co je na tom divného?