如何使用 multipart/form-data 在 curl 中发送内联 xml

How to send inline xml in curl with multipart/form-data

我需要使用 curl 发送一些内联 xml 作为 multipart/form-data 请求中的值。 更准确地说,我使用 ansible shell 来 运行 这个卷曲。我有一个问题,发送请求时出现错误,找不到某些客户端证书。

couldn't open file "?xml version=1.0 encoding=UTF-8?>
<eventPublisher name=EmailPublisher processing=enable
statistics=disable trace=disable 
xmlns=http://wso2.org/carbon/eventpublisher>
<from streamName=id_gov_notify_stream version=1.0.0/>
<mapping

XML 我正在尝试发送:

<?xml version="1.0" encoding="UTF-8"?>
<eventPublisher name="EmailPublisher" processing="enable"
  statistics="disable" trace="disable" xmlns="http://wso2.org/carbon/eventpublisher">
  <from streamName="id_gov_notify_stream" version="1.0.0"/>
  <mapping customMapping="enable" type="text">
    <inline>{{body}}</inline>
  </mapping>
  <to eventAdapterType="email">
    <property name="email.subject">{{subject}}</property>
    <property name="email.address">{{send-to}}</property>
    <property name="email.type">{{content-type}}</property>
  </to>
</eventPublisher>

Ansible 中的 curl 请求:

'curl --location --request POST https://*** --header "Accept: 
 application/json" --header "Content-Type: multipart/form-data" -- 
 user admin@{{ domain}}@{{domain}}:{{ pass }} -F "resourceFile= 
 {{lookup("file", "file.xml")}}" -F "fileName=EmailPublisher"'

以某种方式删除了 resourceFile 键的第一个字符。如何转义或修复 < 将随请求一起发送?

顺便说一句,我使用 curl 因为自 ansible 2.10 以来 uri 模块支持表单数据,我使用 2.9 版本。

并不是说“删除了第一个字符”,而是 -F alpha=<filename 是 curl 在 < 之后解释 "read the form data field alpha from the filename" 的方式,就像在 shell 重定向中一样。

您可能想使用 --form-string,因为它不会使前导 < 变得神奇

您还需要使用 ' 作为 shell 引用,或者让 ansible 为您引用 XML,因为您 had-F x="<?xml version="1.0" encoding="UTF-8"?>" 可以看出这是不合法的 shell

--form-string resourceFile={{ lookup("file", "file.xml") | quote }}

--form-string 'resourceFile={{ lookup("file", "file.xml") }}' 如果您 100% 肯定文件本身永远不会包含 '。显然第一种形式更安全,因为它没有做这样的假设