Python:向请求POST添加XML有效负载不起作用

时间:2016-10-13 07:57:08

标签: python xml rest api python-requests

我正在向媒体转码API提交媒体处理作业。

它基于REST并在通话中接受一些值:

  • workflowIdentifier (必填):API的唯一ID,这是静态的
  • sourceFilename (必填):url编码的samba UNC路径
  • jobName (可选):字符串
  • context (可选):这是API
  • 读取的XML有效内容

以下是一个示例手动提交的示例(为了便于阅读,大部分XML被截断)

POST http://1.1.1.1:1234/SubmitRest/SubmitFile?workflowIdentifier=4r5t6y7u&sourceFilename=%5C%5C10.10.1.20%5Cteststore%5Cmedia%5CTEST001E1.mov&jobName=mytestjob&context=%3CContext+xmlns%3D%22http%3A%2F%2FTelestream.Vantage.Sdk%2F2010%2F07%22+xmlns%3Ai%3D%22http%3A%2F%2Fwww.w3.org%2F2001%2FXMLSchem...

当XML(用于上下文)足够小时,此工作

然而,在我们的生产环境中,将一个非常大的XML有效负载发送到“上下文”,所以我得到了:

<hr><p>HTTP Error 414. The request URL is too long.</p>

- 所以在做了一些搜索后,我尝试了以下

context_string = (the very large XML document as a string)
source_file =
    '%5C%5C10.10.1.20%5Cteststore%5Cmedia%5CTEST001E1.mov'
job_name = 'testjob'
workflow_id = '4r5t6y7u'
url = 'http://1.1.1.1:1234/SubmitRest/SubmitFile?workflowIdentifier=' + workflow_id + '&sourceFilename=' + source_file + '&jobName=' + job_name
reply = requests.post(url, data={'context': context_string})

API成功接受作业,但忽略上下文有效负载。

(请注意,我已尝试使用编码的XML网址,并将其作为普通字符串)

我也尝试过这样:

context_string = (the very large XML document as a string)
source_file =
        '%5C%5C10.10.1.20%5Cteststore%5Cmedia%5CTEST001E1.mov'
job_name = 'testjob'
workflow_id = '4r5t6y7u'
payload = {'workflowIdentifier': workflow_id, 'sourceFilename': source_file, 'context': context_stringa, 'jobName': jobname}
reply = requests.post(url, data=payload)

这根本不起作用,因为找不到必填字段而失败(例如workflowIdentifier

当我可以将所有数据放入一个URI时,完全难以理解它的工作原理,但是当我尝试将其添加到带有请求的有效负载时它不起作用(data =)

所以我的主要问题是 - 如何通过python请求提交这个,就像它是URI POST调用的全部内容一样?我一定是在做错事。

修改

所以我在POST调用上做了数据包捕获: 这是我发送的命令:

requests.post(url, data={'context': context_string})

以下是数据包捕获的样子:

POST /SubmitRest/SubmitFile?workflowIdentifier=4r5t6y7u&sourceFilename=%5C%5C10.10.1.20%5Cteststore%5Cmedia%5CTEST001E1.mov&jobName=testjob HTTP/1.1
Host: x.x.x.x:1234
Connection: keep-alive
Accept-Encoding: gzip, deflate
Accept: */*
User-Agent: python-requests/2.11.1
Content-Length: 20749

context=<Context xmlns="http://Telestream.Vantage.Sdk/2010/07" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"><xmlns i:nil="true" xmlns="http://schemas.datacontract.org/2004/07/Telestream.Soa.Vocabulary" xmlns:a="http://schemas.datacontract.org/2004/07/System.Xml.Serialization"/>
(omitted the rest of the XML)

1 个答案:

答案 0 :(得分:0)

以上问题与Python无关。旧的Vantage API需要将context.xml放置为URL的一部分。如果您的URL太长,它将失败。您可以通过Postman进行测试来确认相同的内容(我的意思是没有Python)。

我建议您更新到最新的Vantage(8.0)及其API版本(5+)。较新的API接受JSON有效负载。所有变量及其值都作为JSON的一部分出现,而不会影响URL。

新API的文档可作为Vantage SDK的一部分获得。发布URL后,您将必须创建一个帐户才能访问它。

我已经使用Postman尝试了相同的方法,并且可以正常工作。您可以尝试相同的方法。