无法使用python请求发布文件 - 来自curl

时间:2018-02-27 12:57:51

标签: python curl python-requests

以下命令有效,但我无法使用python-requests(2.18.4)重现它:

curl -X POST -H "Authorization: Bearer ..." \
             -H "Content-Type: multipart/form-data" \
             -F 'metadata={...} 
             -F 'data=@data.bz2;type=application/octet-stream' 
              https://www....com

使用下面的send_devices,我收到"不支持的媒体类型""

def send_devices(basic_auth):
    endpoint_api = ' https://www....com'
    with open('data.bz2','rb') as payload:
        response = requests.post(endpoint_api, data={'metadata': ...,
                                                     'data': payload},
                                 headers={'Authorization': 'Bearer {0}'.format(basic_auth})

经过一些评论后,我也尝试了,现在的错误是"无效的元数据Json字符串":

def send_devices(basic_auth):
    endpoint_api = ' https://www....com'
    files = {'file': ('data.bz2', open('data.bz2', 'rb'), 'application/octet-stream')}
    response = requests.post(endpoint_api, data={"metadata": {"extensions":{"urnType":"IDFA"}}},
                             files=files, headers={'Authorization': 'Bearer {0}'.format(basic_auth)})

3 个答案:

答案 0 :(得分:1)

确保有效负载格式正确。您的有效负载中的第二个对象中似乎缺少“{”。

  

HTTP 415不支持的媒体类型客户端错误响应代码表示服务器拒绝接受请求,因为有效内容格式的格式不受支持。

https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/415

答案 1 :(得分:1)

你应该把它作为文件(而不是数据)。

r = requests.post(url, files={'file': open('data.bz2', 'rb')})

工作正常。

答案 2 :(得分:1)

在第一个示例中,缺少文件类型

                            html, body {
                            margin: 0;
                            }
                            .homepage-top .wrapper {
                                position: relative;
                            }
                            .homepage-top .wrapper:after {
                                padding-top: 50%;
                                display: block;
                                content: ' ';
                            }
                            .homepage-top .flex-container {
                                position: absolute;
                                top: 0;
                                bottom: 0;
                                right: 0;
                                left: 0;
                                padding: 5px;
                                display: flex;
                                -webkit-flex-wrap: wrap;
                                flex-wrap: wrap;
                            }
                            .homepage-top .flex-container>div {
                                height: 100%;
                                display: flex;
                                flex-direction: column;
                            }
                            .homepage-top .flex-container>div>div {
                                margin: 5px;
                                display: flex;
                            }
                            .homepage-grid-left-col {
                                width: 50.5%;
                            }
                            /*Slider styling */
                            .homepage-grid-left-col .homepage-grid-left-row {
                                width: 98.5%;
                            }
                            .homepage-grid-left-slider {
                                height: 100%;
                                display: flex;
                                overflow: hidden;
                            }

                            .slick-slide .slide1 {
                                background-image: url("http://p-hold.com/585/540");
                                background-repeat: no-repeat;
                                background-size: cover;
                                background-position: center;
                                padding-top: 78.5%;
                            }
                            .slick-slide .slide2 {
                                background-image: url("http://p-hold.com/585/540");
                                background-repeat: no-repeat;
                                background-size: cover;
                                background-position: center;
                                padding-top: 72.5%;
                            }
                            .slick-slide .slide3 {
                                background-image: url("http://p-hold.com/585/540");
                                background-repeat: no-repeat;
                                background-size: cover;
                                background-position: center;
                                padding-top: 78.5%;
                            }
                            .slick-slide .grid-title h2 {
                                font-size: 1.5em;
                                color: #fff;
                                text-shadow: 2px 2px #000;
                            }
                            .slick-slide .grid-title {
                                padding: 2% 3% 7% 3%;
                                background: -moz-linear-gradient(top, transparent 0, rgba(0, 0, 0, 0.40) 15%, rgba(0, 0, 0, 0.75) 100%);
                                background: -webkit-gradient(linear, left top, left bottom, color-stop(0, transparent), color-stop(15%, rgba(0, 0, 0, 0.40)), color-stop(100%, rgba(0, 0, 0, 0.75)));
                                background: -webkit-linear-gradient(top, transparent 0, rgba(0, 0, 0, 0.40) 15%, rgba(0, 0, 0, 0.75) 100%);
                                background: -o-linear-gradient(top, transparent 0, rgba(0, 0, 0, 0.40) 15%, rgba(0, 0, 0, 0.75) 100%);
                                background: -ms-linear-gradient(top, transparent 0, rgba(0, 0, 0, 0.40) 15%, rgba(0, 0, 0, 0.75) 100%);
                                background: linear-gradient(to bottom, transparent 0, rgba(0, 0, 0, 0.40) 15%, rgba(0, 0, 0, 0.75) 100%) filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#a6000000', GradientType=0);
                            }
                            .slick-dots li button {
                                border: 3px solid #fff;
                                border-radius: 50%;
                            }
                            .slick-dots li button::before {
                                color: transparent;
                                background: transparent;
                            }
                            .slick-dots li button:focus::before {
                                opacity: 0;
                                color: transparent;
                                background: transparent;
                                border-radius: 50%;
                            }
                            .slick-dots li button:hover::before, .slick-dots li.slick-active button::before {
                                opacity: 1;
                                color: #fff;
                                background: #fff;
                                border-radius: 50%;
                            }
                            .slick-dots {
                                bottom: 55px;
                            }
                            .slick-prev, .slick-next {
                                color: #fff;
                            }
                            .slick-prev {
                                left: 10px;
                                z-index: 10;
                            }
                            .slick-next {
                                right: 10px;
                                z-index: 10;
                            }
                            .homepage-grid-right-col {
                                width: 49.5%;
                            }
                            .homepage-grid-right-col .homepage-grid-top-right {
                                height: 50%;
                                background: #ddd;
                                background-image: url("http://p-hold.com/585/265");
                                background-size: cover;
                                background-position: center;
                            }
                            .homepage-grid-right-col .homepage-grid-bottom-right {
                                height: 50%;
                            }
                            .homepage-grid-bottom-right-inner, .grid-right {
                                flex: 1;
                                display: flex;
                            }
                            .homepage-grid-bottom-right-inner .grid-left {
                                width: 50%;
                                margin-right: 5px;
                                background-image: url("http://p-hold.com/280/270");
                                background-size: cover;
                                background-position: center;
                            }
                            .homepage-grid-bottom-right-inner .grid-right {
                                width: 50%;
                                background: #ddd;
                                margin-left: 5px;
                                background-image: url("http://p-hold.com/280/270");
                                background-size: cover;
                                background-position: center;
                            }
                            .homepage-grid-top-right .grid-title {
                                height: 45%;
                                width: 100%;
                                padding: 10px 20px;
                                display: inline-block;
                                background: -moz-linear-gradient(top, transparent 0, rgba(0, 0, 0, 0.40) 10%, rgba(0, 0, 0, 0.75) 100%);
                                background: -webkit-gradient(linear, left top, left bottom, color-stop(0, transparent), color-stop(10%, rgba(0, 0, 0, 0.40)), color-stop(100%, rgba(0, 0, 0, 0.75)));
                                background: -webkit-linear-gradient(top, transparent 0, rgba(0, 0, 0, 0.40) 10%, rgba(0, 0, 0, 0.75) 100%);
                                background: -o-linear-gradient(top, transparent 0, rgba(0, 0, 0, 0.40) 10%, rgba(0, 0, 0, 0.75) 100%);
                                background: -ms-linear-gradient(top, transparent 0, rgba(0, 0, 0, 0.40) 10%, rgba(0, 0, 0, 0.75) 100%);
                                background: linear-gradient(to bottom, transparent 0, rgba(0, 0, 0, 0.40) 10%, rgba(0, 0, 0, 0.75) 100%) filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#a6000000', GradientType=0);
                            }
                            .homepage-grid-bottom-right .grid-right .grid-title {
                                height: 45%;
                                width: 100%;
                                padding: 10px 20px;
                                display: inline-block;
                                background: -moz-linear-gradient(top, transparent 0, rgba(0, 0, 0, 0.40) 5%, rgba(0, 0, 0, 0.75) 100%);
                                background: -webkit-gradient(linear, left top, left bottom, color-stop(0, transparent), color-stop(5%, rgba(0, 0, 0, 0.40)), color-stop(100%, rgba(0, 0, 0, 0.75)));
                                background: -webkit-linear-gradient(top, transparent 0, rgba(0, 0, 0, 0.40) 5%, rgba(0, 0, 0, 0.75) 100%);
                                background: -o-linear-gradient(top, transparent 0, rgba(0, 0, 0, 0.40) 5%, rgba(0, 0, 0, 0.75) 100%);
                                background: -ms-linear-gradient(top, transparent 0, rgba(0, 0, 0, 0.40) 5%, rgba(0, 0, 0, 0.75) 100%);
                                background: linear-gradient(to bottom, transparent 0, rgba(0, 0, 0, 0.40) 5%, rgba(0, 0, 0, 0.75) 100%) filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#a6000000', GradientType=0);
                            }
                            .homepage-grid-top-right .grid-title, .homepage-grid-bottom-right .grid-right .grid-title {
                                align-self: flex-end;
                            }
                            .homepage-grid-left-col .grid-title h2, .homepage-grid-top-right .grid-title h2, .homepage-grid-bottom-right-inner .grid-right .grid-title h2 {
                                font-size: 1.5em;
                                color: #fff;
                                text-shadow: 2px 2px #000;
                            }
                            @media (max-width: 1200px) {
                                .homepage-grid-top-right .grid-title {
                                    height: 55%;
                                }
                                .homepage-grid-bottom-right .grid-right .grid-title {
                                    height: 70%;
                                }
                            }
                            @media (max-width: 992px) {
                                .homepage-grid-left-col {
                                    width: 98.5%;
                                }
                                .homepage-grid-right-col {
                                    width: 100%;
                                }
                                .homepage-top .wrapper:after {
                                    padding-top: 100%;
                                    display: block;
                                    content: ' ';
                                    margin-bottom: 99%;
                                }
                                .homepage-grid-right-col .homepage-grid-top-right {
                                    height: 70%;
                                }
                                .homepage-grid-right-col .homepage-grid-bottom-right {
                                    height: 70%;
                                }
                                .homepage-grid-top-right .grid-title, .homepage-grid-bottom-right .grid-right .grid-title {
                                    height: 40%;
                                }
                            }
                            @media (max-width: 768px) {
                                .homepage-grid-top-right .grid-title, .homepage-grid-bottom-right .grid-right .grid-title {
                                    height: 95%;
                                }
                            }

在第二个示例中,需要在相同的文件dict上添加额外的帖子数据。即使不是一个字典:

'data': ('data.bz2', open('data.bz2', 'rb'), 'application/octet-stream'),

解决方案:

'metadata': ('metadata.csv', json.dumps({"extensions": ...}))}