自学内容网 自学内容网

发送URL请求中的问题记录

报错 Unsupport Media Type

先检查请求头中的 Content-Type,通常使用json格式 -> application/json

检查的MIME类型:当服务器指定MIME类型时,如application/xml

服务器可能还是用User-Agent判断请求媒体类型,使用正确的编码如Content-Type:chatset=utf-8

使用不同请求方式传参

POST(添加)/PUT(修改):三个参数 url、data、config;

POST 可以提交比 GET 更大的数据量,相对更安全,请求参数不会被包含在 URL 中;对服务器性能的影响较大,不适用于对同一资源进行多次操作。

PUT 可以更新指定的资源;对服务器性能的影响较大,不适用于对同一资源进行多次操作。

GET(查询)/DELETE(删除):两个参数 url、config,在GET中将入参数据作为config中的params属性值,拼接在url上,而DELETE可以拼接在url上或以request body 形式发送。

GET 可以被缓存和浏览器保存,对服务器性能的影响较小;不适合用于提交敏感数据,仅适用于对资源进行查询操作,不能修改服务器端的状态。

DELETE 可以永久删除指定的资源;对服务器性能的影响较大,不适于对同一资源多次操作。

headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
}
requests.post(url=register_url, headers=headers, data=json.dumps(register_info))
requests.put(url=update_url, headers=headers, data=json.dumps(register_info))

params = {"serviceId": service_id}
response = requests.get(url=search_url, headers=headers, params=params)

info = {"serviceId": service_id, "appid": app_id}
requests.delete(url=delete_url, headers=headers, params=info)
requests.delete(url=delete_url, headers=headers, data=info)

注意:参数中如果有特殊字符如“%”等需要转义,否则会报错。

url中的转义问题

使用flask框架连接数据库,遇到密码中含有特殊字符‘@’,在做url解析时会将密码和host切分错误,导致连接失败;

解决:

对‘@’做url的转义,变为‘%40’ -> 字符的ASCII码(16进制),问题解决;在使用GET等方法发送请求时也会遇到类似问题,可将特殊符号做 url 转义;

%2C:',',%40:'@',%3A:':',%20:space,%5B:'[',%5D:']',%23:'#',%2B: +,%2F:/,%3F:?,%26:&,%3D:=,

上传文件

上传文件时通常使用multipart/form-data格式构建请求数据,可能会遇到 Failed to parse multipart servlet request,通常是由于服务器无法正确解析发送的 multipart/form-data 请求造成的。

上传文件时需要使用requests的multipart_encoder.MultipartEncoder构建请求主体;

import requests
from requests_toolbelt import MultipartEncoder

file_data = open()
multipart_encoder = MultipartEncoder(
    fields={
        'file': ('example.txt', file_data, 'text/plain'),
        'name': 'John'
    }
)
headers = {'Content-Type': multipart_encoder.content_type}
res = requests.post(url, data=multipart_encoder, headers=headers)

对yaml文件upload_type为application/octet-stream
其他文件可使用application/json
files = [('fileDescriptor', (file_name, file, upload_type))]
res = requests.post(upload_url, headers=headers, data={}, files=files)

参考:

详解HTTP四种请求:POST、GET、DELETE、PUT-阿里云开发者社区

python Failed to parse multipart servlet request; nested exception is java.l_mob649e81680b4f的技术博客_51CTO博客


原文地址:https://blog.csdn.net/MarkAustralia/article/details/142850577

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!