我使用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。我使用像雅虎这样的常用网站登录。有什么建议吗?
答案 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>