我试图通过本机应用程序将一些JSON发布到本地网络上的端点,但它似乎并没有实际发布主体。
fetch( 'http://192.168.4.1/access-points', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify( {
ssid: 'SSIDNAME',
password: 'SSIDPASSWORD',
} ),
} );
它使用正确的方法和内容类型命中端点,但是身体无法找到。
以下是我从react本机应用程序发出请求时端点似乎收到的内容。
POST /access-points HTTP/1.1
Host: 192.168.4.1
Content-Type: application/json
Connection: keep-alive
Accept: */*
User-Agent: Hame/1 CFNetwork/808.2.16 Darwin/15.6.0
Content-Length: 45
Accept-Language: en-us
Accept-Encoding: gzip, deflate
当我使用Paw发出请求时,这就是我得到的
POST /access-points HTTP/1.1
Content-Type: application/json; charset=utf-8
Host: 192.168.4.1
Connection: close
User-Agent: Paw/3.0.16 (Macintosh; OS X/10.11.6) GCDHTTPRequest
Content-Length: 45
{"ssid":"SSIDNAME","password":"SSIDPASSWORD"}
正如您所看到的,两者都报告了正确的Content-Length
答案 0 :(得分:1)
我遇到了类似的问题-Spring Boot服务可以从Postman接收POST正文,但是我收到的来自我的React应用的调用没有正文,并且Content-Length
为-1
。
经过一番狩猎,我遇到了https://github.com/github/fetch/issues/318#issuecomment-335086509。这使我学习了更多有关CORS的知识,并在Spring Boot应用程序的@RestController
类中添加了以下内容:
@CrossOrigin(origins = WHITELISTED_AUTHORITY)
或者,React客户端fetch
调用可以具有:
headers: {
Origin: AUTHORITY,
}
从服务器上设置它会要求客户端发送该信息,这使客户端程序员不必做那么一件事,但是它可以(我不知道所有这些工作如何深入到可以肯定的- ,请修改此答案),从而导致客户端和服务器之间的往返次数增加。
答案 1 :(得分:0)
我遇到了同样的问题,然后检查了request.form和request.data,发现正文已发送到request.data,所以request.form返回None
因此解决方案是将request.form更改为request.data或将fetch选项更改为将正文发送给request.form
如果要将正文发送给request.form,请设置标题:
subprocess.call()
例如,数据为
'Accept': 'application/json',
'Content-Type': 'multipart/form-data'
然后创建表单数据:
const data = {
ssid: 'SSIDNAME',
password: 'SSIDPASSWORD',
}
然后抓取将是:
const formData = new FormData();
for (key in data) {
formData.append(key, data[key]);
}