eXist-db 6.2中Expath HTTP Client多部分请求上传文件报错排查
问题
在eXist-db 6.2中使用Expath HTTP客户端发送multipart格式的POST请求上传XML文件时,服务端返回500错误,提示“Unable to retrieve file from request”,无法确定是<http:body>属性设置还是XML文档包含方式导致的问题,请求代码如下:
import module namespace http="http://expath.org/ns/http-client"; let $xml-doc-to-send := doc("/db/apps/myapp/data/myfile.xml") let $request := http:send-request( <http:request http-version="1.1" method="post"> <http:header name="X-API-KEY" value="-----------"/> <http:header name="accept" value="application/json"/> <http:header name="Content-Type" value="multipart/form-data"/> <http:multipart media-type="multipart/form-data" boundary="_bd8e2bb8-ba83-42e0-8e2b-b8ba83a2e042_"> <http:header name="Content-Disposition" value='form-data; name="file";filename="myfile.xml";type="text/xml"'/> <http:body media-type="text/xml" method="xml"/> </http:multipart> </http:request>, "https://some.provider/api/uploads", $xml-doc-to-send ) return $request
排查与修复
问题源于multipart内容传递方式错误及请求头冗余设置,修正点如下:
- 移除根
<http:request>中的Content-Type头:<http:multipart>已指定media-type="multipart/form-data",重复设置会导致服务端无法正确解析请求边界。 - 调整
<http:body>的内容绑定:原代码中<http:body>未关联XML文档,需将XML内容直接嵌入到<http:body>内部,而非作为http:send-request的第三个参数传递。 - 修正
Content-Disposition格式:type不属于该头的标准字段,应将媒体类型通过单独的Content-Type头指定。
修正后的代码:
import module namespace http="http://expath.org/ns/http-client"; let $xml-doc-to-send := doc("/db/apps/myapp/data/myfile.xml") let $request := http:send-request( <http:request http-version="1.1" method="post"> <http:header name="X-API-KEY" value="-----------"/> <http:header name="accept" value="application/json"/> <http:multipart media-type="multipart/form-data" boundary="_bd8e2bb8-ba83-42e0-8e2b-b8ba83a2e042_"> <http:header name="Content-Disposition" value='form-data; name="file"; filename="myfile.xml"'/> <http:header name="Content-Type" value="text/xml"/> <http:body media-type="text/xml" method="xml">{$xml-doc-to-send}</http:body> </http:multipart> </http:request>, "https://some.provider/api/uploads" ) return $request
关键说明
- 将XML文档嵌入
<http:body>内部,确保multipart部分能正确封装文件内容,服务端可识别并提取。 - 移除冲突的
Content-Type头,遵循HTTP规范,避免请求格式混乱。 - 拆分
Content-Disposition中的非标准字段,用独立的Content-Type头指定文件媒体类型,符合服务端解析预期。
内容的提问来源于stack exchange,提问作者jbrehr
相关产品推荐
相关产品推荐

