HttpClient statusCodes

时间:2012-01-06 20:29:29

标签: java httpclient

我使用HttpCLient自动登录网站。我获得statusCode为'200'。 API说SC 200 - 好的。那是什么意思?登录成立? 当我看到statusCodes列表时,SC Accepted - 202.Accepted和OK之间有什么区别。 如果登录成立,我应该获得什么状态代码?请帮忙。

pesudo代码,如果这有助于回答:

import java.io.IOException;

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.NameValuePair;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.methods.PostMethod;

public class HttpTest {
    public static void main(String args[]) throws HttpException, IOException {

    HttpClient client = new HttpClient();

    // make the initial get to get the SESSION cookie
    GetMethod get = new GetMethod(
    "http://www.yahoo.com/");
    client.executeMethod(get);
    get.releaseConnection();

    // authorize
    PostMethod post = new PostMethod(
    "https://login.yahoo.com/config/login?");
    NameValuePair[] data = {
    new NameValuePair("login", "aaa@yahoo.com"),
    new NameValuePair("passwd", "bbb")
    };
    post.setRequestBody(data);
    client.executeMethod(post);
    post.releaseConnection();

    //resubmit the original request
    client.executeMethod(get);
    String response = get.getResponseBodyAsString();
    get.releaseConnection();
    System.out.println("Status Code :::"+get.getStatusCode());
    System.out.println(response);    
    }
}

这是我一直在尝试的基于表单的身份验证。我在这里得到了同样的问题... 200-ok for wrongper credentials。我使用像雅虎这样的常用网站登录。有什么建议吗?

5 个答案:

答案 0 :(得分:4)

Java的HttpClient状态代码与RFC1945(HTTP 1.0),RFC2616(HTTP 2.0)和RFC2618(WebDAV)中定义的状态代码相同。

这些特定代码表示:

200 OK

请求已成功。响应返回的信息取决于请求中使用的方法,例如:

在响应中发送与所请求资源相对应的实体;

HEAD对应于所请求资源的实体标题字段在响应中发送,没有任何消息体;

POST一个描述或包含行动结果的实体;

跟踪包含终端服务器收到的请求消息的实体。

202接受

请求已被接受处理,但处理尚未完成。该请求最终可能会或可能不会被执行,因为在实际处理时可能不允许该请求。没有从异步操作中重新发送状态代码的工具。

202回复是故意不承诺的。其目的是允许服务器接受对某些其他进程的请求(可能是每天只运行一次的面向批处理的进程),而不要求用户代理与服务器的连接持续到进程完成为止。使用此响应返回的实体应该包括请求的当前状态的指示,以及指向状态监视器的指针或用户可以期望满足请求的某种估计。

有关其他常见HTTP状态代码的定义,请参阅RFC2616

答案 1 :(得分:1)

200 means the request was successful,响应基于该成功请求。 202意味着请求成功并已在服务器上排队等待处理,因此响应不是基于请求的成功完成,因为它尚未完成。

把它想象成一个简短的对话交流......

<强> 200

  

客户:这是我的要求   服务器:谢谢!我已经处理了你的请求。以下是您要查找的回复。

VS

<强> 202

  

客户:这是我的要求   服务器:谢谢!我还没有完成它的处理,但我只是让你知道我收到它并且它正在进行中。

我无法想象登录需要很长时间,因此我希望登录成功后总能返回200响应。

答案 2 :(得分:0)

202 Accepted表示您的请求正在由接收方处理(类似我的应用程序会查看它)。

200 OK表示您的应用程序已处理并被授予您所请求的内容(无论是登录(或)请求其他资源)。

答案 3 :(得分:0)

查看此列表:http://en.wikipedia.org/wiki/List_of_HTTP_status_codes

但正如米兰所说,您应该检查API并确保API使用这些错误代码的方式与标准使用它们的方式相同。

例如,您可以尝试登录获取200,但返回的有效负载有登录失败消息。

一个性能更好的实现会返回200表示良好的登录,而401或403则表示登录错误。

答案 4 :(得分:0)

我们使用以下代码进行状态代码输出。请注意,类首先是来自服务器响应的pojo对象:

public void doFirst(int i) throws ClientProtocolException, IOException {

HttpClient client = HttpClientBuilder.create().build();

HttpGet request = new HttpGet("url" + i);
request.addHeader("content-type", "application/json");
HttpResponse response1 = client.execute(request);
if(response1.getStatusLine().getStatusCode() != 200){
    System.err.println(response1.getStatusLine().getStatusCode());
}
String json = EntityUtils.toString(response1.getEntity(), "UTF-8");
Gson gson = new Gson();
first ress = gson.fromJson(json, first.class);
System.out.println("Incoming data: " + ress.getNumber());

/////some action///////
HttpPost post = new HttpPost("url" + i);
firstSol sol= new firstSol();
sol.setNumber(k);
System.out.println("Data to send : " + gson.toJson(sol) );
post.setEntity(new StringEntity(gson.toJson(sol)));
client.execute(post);
HttpResponse response2 = client.execute(request);
if(response2.getStatusLine().getStatusCode() != 200){
System.err.println(response2.getStatusLine().getStatusCode());
}
}

您可能会看一下以下maven依赖关系:

<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.3.4</version>
</dependency>
<dependency>
      <groupId>commons-codec</groupId>
      <artifactId>commons-codec</artifactId>
      <version>1.2</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.2.4</version>
</dependency>
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-compress</artifactId>
    <version>1.9</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-io</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.5</version>
</dependency>