发送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博客

在Java,捕捉并记录HTTP请求通常涉及到使用第三方库如Apache HttpClient、OkHttp或者Spring框架的RestTemplate等。以下是一个简单的例子,我们将使用Spring Boot的`WebClient`来进行HTTP请求,并利用`MockMvc`来模拟和记录请求: ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.http.MediaType; import org.springframework.test.web.client.MockMvc; import org.springframework.test.web.client.RequestPostHandler; import org.springframework.test.web.client.match.MockRestRequestMatchers; import org.springframework.test.web.client.response.MockRestResponseCreators; @org.junit.jupiter.api.Test class MyControllerTest { @Autowired private MockMvc mockMvc; @MockBean private YourService yourService; // 假设YourService是处理HTTP请求的服务 @Test void testSendAndRecordRequest() { // 创建一个请求对象 String url = "http://example.com/api"; RequestPostHandler requestPostHandler = (request) -> { // 使用yourService作为目标并执行请求 yourService.sendRequest(url); // 创建响应 return MockRestResponseCreators.withSuccess("mock response", MediaType.APPLICATION_JSON); }; // 发送请求记录 mockMvc.perform(post(url).accept(MediaType.APPLICATION_JSON).content(requestPostHandler)) .andExpect(MockRestRequestMatchers.status().isOk()) .andExpect(MockRestRequestMatchers.content().json(equalTo("mock response"))); // 可能的操作:获取并检查记录下来的请求信息,例如headers、body内容等 // 记录请求的相关代码会取决于你如何实现YourService或者是否使用了日志框架 } } ``` 在这个例子,`YourService.sendRequest(url)`这部分通常是实际发起HTTP请求的地方,而在测试时,我们通过`MockMvc`创建了一个假的`sendRequest`调用,用于记录目的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值