Java HttpClient状态码

Java HttpClient状态码,java,httpclient,Java,Httpclient,我正在使用HttpCLient自动登录网站。我得到的状态码是“200”。API说SC200-好的。这是什么意思?登录是否已建立? 当我看到状态代码列表时,有一个SC Accepted-202。“接受”和“确定”之间有什么区别。 如果建立了登录,我应该获得什么状态码?请帮忙 pesudo代码,如果这有助于回答: import java.io.IOException; import org.apache.commons.httpclient.HttpClient; import org.apach

我正在使用HttpCLient自动登录网站。我得到的状态码是“200”。API说SC200-好的。这是什么意思?登录是否已建立? 当我看到状态代码列表时,有一个SC Accepted-202。“接受”和“确定”之间有什么区别。 如果建立了登录,我应该获得什么状态码?请帮忙

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。我使用一个像雅虎一样的普通网站登录。有什么建议吗?

202接受意味着接收者正在处理您的请求,就像我收到的一样。您的申请将对此进行调查

200“确定”表示您的应用程序已被处理并被授予您所请求的权限,无论是登录还是请求其他资源。

并且响应基于该成功请求。202意味着请求已成功并已排队等待在服务器上处理,因此响应不是基于请求的成功完成,因为它不一定已经完成

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

200:

客户:这是我的要求 服务员:谢谢!我已经处理了你的请求。这是你想要的答案

vs

202:

客户:这是我的要求 服务员:谢谢!我还没有处理完,但我只是告诉你我已经收到了,并且正在进行中

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

查看以下列表:

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

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


性能更好的实现将返回200表示良好登录,401或403表示不良登录。

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

这些特定代码意味着:

200行

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

获取响应中发送的请求资源对应的实体

HEAD响应中发送请求资源对应的实体头字段,不带任何消息体

发布描述或包含行动结果的实体

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

202接受

请求已被接受处理,但处理尚未完成。请求可能最终会被执行,也可能不会被执行,因为当处理实际发生时,请求可能会被拒绝。没有任何工具可用于从这样的异步操作重新发送状态代码

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


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

我们使用以下代码作为状态代码输出。请注意,类首先是来自服务器响应的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>

根据实现的不同,您应该查看他们的API文档,了解200和210的含义。好吧,试试另一种情况!尝试使用不正确的凭据登录,看看会发生什么。非常感谢。为了再次检查,我更改了密码,甚至现在,我看到了SC 200。我现在不明白。没有更多信息,我们能做的最好的事情就是列举HTTP响应的含义。如果不知道您登录的系统的具体情况,我们就无法真正说出您应该期待什么样的响应。对于大多数系统,我倾向于说,无论您成功还是失败,都应该发送200 OK,但是响应的主体应该包含成功或失败状态,而不是状态代码所在的头100%清除,状态码200仅仅意味着HTTP服务器已收到您的数据包,并且没有错误,并且正在响应这些数据包。statusCode可能不是确定大多数系统登录成功/失败的合适位置。我已经编辑了我的Q并添加了pesudo代码。我检查了一些随机的网站,所有的东西都给出了不正确的证明SC200。不知道怎么了。如何调试。我该怎么做
除非您尝试HTTP身份验证,否则您几乎总能得到200 OK的响应。尝试使用GetResponseBy,它将包含web服务器的完整HTML响应。您可能会在响应体中看到某种登录失败或登录成功消息,您可以对其进行解析。如果您正在尝试HTTP身份验证,请尝试访问受限资源并检查状态码403。欢迎使用StackOverflow!请努力描述您的代码,它有助于询问者和社区。