Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Python请求模拟带有1个或多个文件和JSON主体的CURL-POST发送多部分请求_Java_Python 2.7_Spring Boot_Curl_Python 2.x - Fatal编程技术网

Java Python请求模拟带有1个或多个文件和JSON主体的CURL-POST发送多部分请求

Java Python请求模拟带有1个或多个文件和JSON主体的CURL-POST发送多部分请求,java,python-2.7,spring-boot,curl,python-2.x,Java,Python 2.7,Spring Boot,Curl,Python 2.x,我已经做了两天了,运气不好 工作卷曲请求 curl -X POST -v "http://$1:8080/controller/endpoint" -H "Cache-Control: no-cache" -H "Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW" -F "message={ \"id\": \"b3562c86-6ff4-4bf7-9c4a-4c64fff4d0ea

我已经做了两天了,运气不好

工作卷曲请求

curl -X POST -v "http://$1:8080/controller/endpoint" -H "Cache-Control: no-cache" -H "Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW" -F "message={ \"id\": \"b3562c86-6ff4-4bf7-9c4a-4c64fff4d0ea\", \"stuff\": [
{
\"id\": \"1ca2d9b1-1d73-432a-b483-be404afff8da\",
.......
\"endTime\": \"\"
}]}};type=application/json" -F "files=@file.zip"
返回如下所示的输出:

 ./rest.sh http://127.0.0.1/anything
* Hostname was NOT found in DNS cache
*   Trying 127.0.0.1...
* Connected to 127.0.0.1 (127.0.0.1) port 80 (#0)
> POST /anything HTTP/1.1
> User-Agent: curl/7.35.0
> Host: 127.0.0.1
> Accept: */*
> Cache-Control: no-cache
> Content-Length: 493
> Expect: 100-continue
> Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW; boundary=------------------------52912a6946761b42
>
< HTTP/1.1 100 Continue
< HTTP/1.1 200 OK
* Server gunicorn/19.9.0 is not blacklisted
< Server: gunicorn/19.9.0
< Date: Tue, 12 Feb 2019 18:18:56 GMT
< Connection: keep-alive
< Content-Type: application/json
< Content-Length: 725
< Access-Control-Allow-Origin: *
< Access-Control-Allow-Credentials: true
<
{
  "args": {},
  "data": "",
  "files": {
    "files": "ZIP-CONTENT-GOES-HERE"
  },
  "form": {
    "message": "{ \"runId\": \"1ca2d9b1-1d73-432a-b483-be404a13e8da\", \"reports\": [\n{\n\"executionId\": \"1ca2d9b1-1d73-432a-b483-be404a13e8da\",\n\"endTime\": \"\"\n}]}}"
  },
  "headers": {
    "Accept": "*/*",
    "Cache-Control": "no-cache",
    "Content-Length": "493",
    "Content-Type": "multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW; boundary=------------------------52912a6946761b42",
    "Expect": "100-continue",
    "Host": "127.0.0.1",
    "User-Agent": "curl/7.35.0"
  },
  "json": null,
  "method": "POST",
  "origin": "172.17.42.1",
  "url": "http://127.0.0.1/anything"
}
* Connection #0 to host 127.0.0.1 left intact
你看到区别了吗?这两个文件现在嵌入到表单/文件中,而不是单独显示文件和表单/消息

这种CURL请求在javaapi端点上被接受 在调试器中如下所示:

但是我在Python上的所有尝试,例如:

multipart_form_data_object = {
    'scrubbed.zip': (args.files[0], open(args.files[0], 'rb'), "application/json"),
    'files': (args.files[1], open(args.files[1], 'rb'), "application/json"),
    'message': (None, open(args.message, 'rb'), 'application/json')
}
 response = requests.post(args.url + ':' + str(args.port) + '/' + args.endpoint, files=multipart_form_data_object,
                             proxies=proxies)
(这是我得到的最接近工作的),看起来像这样:

multipart_form_data_object = {
    'scrubbed.zip': (args.files[0], open(args.files[0], 'rb'), "application/json"),
    'files': (args.files[1], open(args.files[1], 'rb'), "application/json"),
    'message': (None, open(args.message, 'rb'), 'application/json')
}
response = requests.post(args.url + ':' + str(args.port) + '/' + args.endpoint, files=multipart_form_data_object,
                         proxies=proxies)
其输出为:

{'Content-Length': '664', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'User-Agent': 'python-requests/2.21.0', 'Connection': 'keep-alive', 'Content-Type': 'multipart/form-data; boundary=227d4ef5a41db8a690e5cebadf336851'}
{
  "args": {},
  "data": "",
  "files": {
    "files": "ZIP-CONTENT-GOES-HERE",
    "scrubbed.zip": "ZIP-CONTENT-GOES-HERE22222"
  },
  "form": {
    "message": "{\r\n  \"runId\": \"9c4a-4c64f6d4d0ea\",\r\n  \"reports\": [\r\n    {\r\n      \"executionId\": \"d73-432a-b483-be404a13e8da\",\r\n      \"endTime\": \"\"\r\n    }\r\n  ]\r\n}"
  },
  "headers": {
    "Accept": "*/*",
    "Accept-Encoding": "gzip, deflate",
    "Connection": "keep-alive",
    "Content-Length": "664",
    "Content-Type": "multipart/form-data; boundary=227d4ef5a41db8a690e5cebadf336851",
    "Host": "java.api.host.com",
    "User-Agent": "python-requests/2.21.0"
  },
  "json": null,
  "method": "POST",
  "origin": "10.0.0.2",
  "url": "http://java.api.host.com/anything"
}
现在,尝试将其调整为发送一个文件数组(否则,如果我将
scrobed.zip
重命名为
files
,它将被覆盖),使其看起来像:

multipart_form_data_object = {
    'files': [(args.files[0], open(args.files[0], 'rb'), "application/json"),
     (args.files[1], open(args.files[1], 'rb'), "application/json")],
    'message': (None, open(args.message, 'rb'), 'application/json')
}
导致错误的原因:

Traceback (most recent call last):
  File ".\load_stress_test_endpoint.py", line 84, in <module>
    post()
  File ".\load_stress_test_endpoint.py", line 76, in post
    proxies=proxies)
  File "C:\Python\Python27\lib\site-packages\requests\api.py", line 116, in post
    return request('post', url, data=data, json=json, **kwargs)
  File "C:\Python\Python27\lib\site-packages\requests\api.py", line 60, in request
    return session.request(method=method, url=url, **kwargs)
  File "C:\Python\Python27\lib\site-packages\requests\sessions.py", line 519, in request
    prep = self.prepare_request(req)
  File "C:\Python\Python27\lib\site-packages\requests\sessions.py", line 462, in prepare_request
    hooks=merge_hooks(request.hooks, self.hooks),
  File "C:\Python\Python27\lib\site-packages\requests\models.py", line 316, in prepare
    self.prepare_body(data, files, json)
  File "C:\Python\Python27\lib\site-packages\requests\models.py", line 504, in prepare_body
    (body, content_type) = self._encode_files(files, data)
  File "C:\Python\Python27\lib\site-packages\requests\models.py", line 169, in _encode_files
    body, content_type = encode_multipart_formdata(new_fields)
  File "C:\Python\Python27\lib\site-packages\urllib3\filepost.py", line 90, in encode_multipart_formdata
    body.write(data)
TypeError: 'tuple' does not have the buffer interface
Traceback (most recent call last):
  File ".\load_stress_test_endpoint.py", line 84, in <module>
    post()
  File ".\load_stress_test_endpoint.py", line 76, in post
    proxies=proxies)
  File "C:\Python\Python27\lib\site-packages\requests\api.py", line 116, in post
    return request('post', url, data=data, json=json, **kwargs)
  File "C:\Python\Python27\lib\site-packages\requests\api.py", line 60, in request
    return session.request(method=method, url=url, **kwargs)
  File "C:\Python\Python27\lib\site-packages\requests\sessions.py", line 519, in request
    prep = self.prepare_request(req)
  File "C:\Python\Python27\lib\site-packages\requests\sessions.py", line 462, in prepare_request
    hooks=merge_hooks(request.hooks, self.hooks),
  File "C:\Python\Python27\lib\site-packages\requests\models.py", line 316, in prepare
    self.prepare_body(data, files, json)
  File "C:\Python\Python27\lib\site-packages\requests\models.py", line 504, in prepare_body
    (body, content_type) = self._encode_files(files, data)
  File "C:\Python\Python27\lib\site-packages\requests\models.py", line 141, in _encode_files
    for (k, v) in files:
ValueError: too many values to unpack
导致错误的原因:

Traceback (most recent call last):
  File ".\load_stress_test_endpoint.py", line 84, in <module>
    post()
  File ".\load_stress_test_endpoint.py", line 76, in post
    proxies=proxies)
  File "C:\Python\Python27\lib\site-packages\requests\api.py", line 116, in post
    return request('post', url, data=data, json=json, **kwargs)
  File "C:\Python\Python27\lib\site-packages\requests\api.py", line 60, in request
    return session.request(method=method, url=url, **kwargs)
  File "C:\Python\Python27\lib\site-packages\requests\sessions.py", line 519, in request
    prep = self.prepare_request(req)
  File "C:\Python\Python27\lib\site-packages\requests\sessions.py", line 462, in prepare_request
    hooks=merge_hooks(request.hooks, self.hooks),
  File "C:\Python\Python27\lib\site-packages\requests\models.py", line 316, in prepare
    self.prepare_body(data, files, json)
  File "C:\Python\Python27\lib\site-packages\requests\models.py", line 504, in prepare_body
    (body, content_type) = self._encode_files(files, data)
  File "C:\Python\Python27\lib\site-packages\requests\models.py", line 169, in _encode_files
    body, content_type = encode_multipart_formdata(new_fields)
  File "C:\Python\Python27\lib\site-packages\urllib3\filepost.py", line 90, in encode_multipart_formdata
    body.write(data)
TypeError: 'tuple' does not have the buffer interface
Traceback (most recent call last):
  File ".\load_stress_test_endpoint.py", line 84, in <module>
    post()
  File ".\load_stress_test_endpoint.py", line 76, in post
    proxies=proxies)
  File "C:\Python\Python27\lib\site-packages\requests\api.py", line 116, in post
    return request('post', url, data=data, json=json, **kwargs)
  File "C:\Python\Python27\lib\site-packages\requests\api.py", line 60, in request
    return session.request(method=method, url=url, **kwargs)
  File "C:\Python\Python27\lib\site-packages\requests\sessions.py", line 519, in request
    prep = self.prepare_request(req)
  File "C:\Python\Python27\lib\site-packages\requests\sessions.py", line 462, in prepare_request
    hooks=merge_hooks(request.hooks, self.hooks),
  File "C:\Python\Python27\lib\site-packages\requests\models.py", line 316, in prepare
    self.prepare_body(data, files, json)
  File "C:\Python\Python27\lib\site-packages\requests\models.py", line 504, in prepare_body
    (body, content_type) = self._encode_files(files, data)
  File "C:\Python\Python27\lib\site-packages\requests\models.py", line 141, in _encode_files
    for (k, v) in files:
ValueError: too many values to unpack

您的脚本应该如下所示:

multipart_form_data_object = {
    'scrubbed.zip': (args.files[0], open(args.files[0], 'rb'), "application/json"),
    'files': (args.files[1], open(args.files[1], 'rb'), "application/json"),
    'message': (None, open(args.message, 'rb'), 'application/json')
}
response = requests.post(args.url + ':' + str(args.port) + '/' + args.endpoint, files=multipart_form_data_object,
                         proxies=proxies)
注意:存在对
请求的依赖性\u toolbelt

发送.py

我使用django对其进行了测试:

url.py

称之为使用:

curl-shttp://127.0.0.1:8000/ -F“message=@$(pwd)/file1“-F”files=@$(pwd)/file2“-F”files=@$(pwd)/file3“

以及使用python

python send.py file1--files file2 file3

相同输出:

{"files": ["{\\"message\\": \\"hello world\\"}\\n", "something else\\n"], "message": ["hello world\\n"]}

谢谢结果证明,我上次尝试(列表)时的错误是元组中没有
消息。。一旦我这样做了,它就可以工作了:)我现在在将其转换为动态代码时遇到问题,这不起作用:
对于args.files中的report\u文件:file\u p=open(report\u file,'rb')multipart\u list.append('files',(file\p.name,file\p,'application/zip)))multipart\u list.append('message',(None,open(args.message,'rb')),'application/json'))
生成的错误是:
ValueError:无法对非2元组的对象进行编码
@Carmageddon很高兴听到这个消息,您能用完整的源代码提出一个新问题,并与我链接吗?我不记得它已经是什么了,解决了问题,也不记得是怎么解决的:)哦,好吧
from django.urls import path
from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt

@csrf_exempt
def dump(request):
    data = {name: [o.read().decode('utf8') for o in request.FILES.getlist(name)] for name in request.FILES.keys()}
    return JsonResponse(data)

urlpatterns = [
    path('', dump),
]
{"files": ["{\\"message\\": \\"hello world\\"}\\n", "something else\\n"], "message": ["hello world\\n"]}