关于 android:在向服务器发送 HTTP 请求后,有时我会得到状态 302(重定向)

After sending HTTP request to server sometimes I get status 302 (redirect)

我尝试使用 json 参数向某些服务器发送 POST 请求,我等待 json 响应。

在 Android 上它工作正常,但在 Linux 上我得到状态 302 重定向。我真的不知道我的问题在哪里。

这是来自 linux 的命令:

curl -i -X POST --data"id=105&json={"orderBy":0"maxResults":50}" "http://mysite.com/ctlClient/"

我得到回应:

1
2
3
4
5
6
7
8
9
10
11
12
 HTTP/1.1 302 Found
 Date: Thu, 04 Jul 2013 12:22:06 GMT
 Server: Apache
 X-Powered-By: PHP/5.3.19
 Set-Cookie: PHPSESSID=dqblvijvttgsdrv2u5tn72p9d6; path=/
 Expires: Thu, 19 Nov 1981 08:52:00 GMT
 Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
 Pragma: no-cache
 location: http://mysite.com/fwf/online/
 Content-Length: 0
 Connection: close
 Content-Type: text/html

从服务器 access log:

"POST /ctlClient/ HTTP/1.1" 302 -"-""curl/7.15.5 (x86_64-redhat-linux-gnu) libcurl/7.15.5 OpenSSL/0.9.8b zlib/1.2.3 libidn/0.6.5"

安卓:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
            String data ="{"orderBy":0"maxResults":50}";
        String WEFI_MAIL_URL ="http://mysite.com/ctlClient/";


        DefaultHttpClient httpclient = null;
        String out = null;

        try {
            httpclient = new DefaultHttpClient();

            HttpPost httpost = new HttpPost(WEFI_MAIL_URL);

            httpost.setHeader("User-Agent","Apache-HttpClient/4.1 (java 1.5)");

            List <NameValuePair> nvps = new ArrayList <NameValuePair>();
            nvps.add(new BasicNameValuePair("id","105"));
            nvps.add(new BasicNameValuePair("json", data));

            httpost.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8));

            HttpResponse response = httpclient.execute(httpost);
            HttpEntity entity = response.getEntity();

            if (entity != null) {
                InputStream is = entity.getContent();
                InputStreamReader isr = new InputStreamReader(is);
                BufferedReader br = new BufferedReader(isr);
                String line = null;
                while ( (line = br.readLine()) != null) {
                    out = line;
                }
                is.close();

                if(isTimeOut == false){
                    _loadActual();
                }
                else{
                    return;
                }  
            } else {
                return;
            }

        } catch (Exception e) {            
        }

        if (httpclient != null) {
            httpclient.getConnectionManager().shutdown();
        }      
    }

access log 对 Android 响应:

1
2
"POST /ctlClient/ HTTP/1.1" 302 -"-""Apache-HttpClient/4.1 (java 1.5)"
"GET /fwf/online/ HTTP/1.1" 200 13981"-""Apache-HttpClient/4.1 (java 1.5)"

我们可以看到在 POST 服务器上将我重定向到 /fwf/online/

从 Wireshark 我得到了两种方法相同的结果:

1
2
3
4
5
6
POST /ctlClient/ HTTP/1.1
User-Agent: Apache-HttpClient/4.1 (java 1.5)
Content-Type: application/x-www-form-urlencoded
Content-Length: 301
Host: mysite.com
Connection: Keep-Alive

为什么它可以在 Android 上运行,但不能在带有 CURL 的 Linux 上运行?

谁能帮助我或指导我如何解决它?

谢谢


您想将 -L 添加到您的 curl 命令中。请参阅 http://curl.haxx.se/docs/faq.html#How_do_I_tell_curl_to_follow_HTT。