我正在尝试通过Retrofit向我的远程Django服务器发送POST请求。我已经为RestAdapter for Retrofit创建了一个日志,但是当我监控日志时,我注意到请求正在以POST方式正确发送:
---> HTTP POST http://[omitted IP]/users/login_user/?username=Lucas&platform=AND&client_version=1.0
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Content-Length: 18
password=abcd12345
---> END HTTP (18-byte body)
但它在服务器上接收(根据tcpdump)作为GET请求。
我可以使用curl发送基本相同的请求:
curl -X POST -H "Content-Type: application/x-www-form-urlencoded; charset=UTF-8" -d 'password=abcd12345' "http://[omitted IP]:22800/users/login_user/?username=Lucas&platform=AND&client_version=1.0"
,这会导致服务器收到POST请求,并正确处理。
以下是tcpdump通过curl发布的POST数据包:
05:54:25.849761 IP [omitted IP].dsl.teksavvy.com.53549 > 192.168.0.150.22080: Flags [P.], seq 1:251, ack 1, win 229, options [nop,nop,TS val 9311380 ecr 191199659], length 250
E...;.@.8.cQE........-V@a./.........f9.....
.....ey.POST /users/login_user/?username=Lucas&platform=AND&client_version=1.0 HTTP/1.1
User-Agent: curl/7.32.0
Host: [omitted IP]:22800
Accept: */*
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Content-Length: 18
password=abcd12345
我认为应该是来自tcpdump通过Retrofit的相同数据包(但不是):
05:57:40.801738 IP [omitted IP].dsl.teksavvy.com.55429 > 192.168.0.150.22080: Flags [P.], seq 1:320, ack 1, win 229, options [nop,nop,TS val 45578792 ecr 191219119], length 319
E..s.g@.8...E.........V@.h...........i.....
..z(.e..GET /users/login_user/?username=Lucas&platform=AND&client_version=1.0 HTTP/1.1
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
User-Agent: Dalvik/1.6.0 (Linux; U; Android 4.2.1; Galaxy Nexus Build/JOP40D)
Host: [omitted IP]:22800
Connection: Keep-Alive
Accept-Encoding: gzip
Content-Length: 18
数据包可以在哪里更改?数据包是否在应用层可能被修改后记录在tcpdump中?或者Retrofit撒谎并实际发送GET请求?有关如何进一步调试此问题的任何想法将不胜感激。
答案 0 :(得分:0)
我通过将端点网址从:endpoint-address.com
更改为www.endpoint-address.com
来解决了问题。这就是服务器从无www地址重定向似乎搞砸了POST请求。