Java 后续的httpClient调用返回初始调用结果
我在一个名为HttpHelper的类中有这些方法。现在,初始调用验证用户凭据并返回true。这是意料之中的。下一个调用是注册一个用户。这似乎没有问题,返回新的用户ID。它不再返回用户ID,而是再次返回true。就像它被缓存了一样,只是从初始调用返回结果。有人知道为什么会发生这种情况吗Java 后续的httpClient调用返回初始调用结果,java,androidhttpclient,Java,Androidhttpclient,我在一个名为HttpHelper的类中有这些方法。现在,初始调用验证用户凭据并返回true。这是意料之中的。下一个调用是注册一个用户。这似乎没有问题,返回新的用户ID。它不再返回用户ID,而是再次返回true。就像它被缓存了一样,只是从初始调用返回结果。有人知道为什么会发生这种情况吗 private static CookieStore sCookieStore; private static String invoke(HttpUriRequest request)
private static CookieStore sCookieStore;
private static String invoke(HttpUriRequest request)
throws ClientProtocolException, IOException {
String result = null;
DefaultHttpClient httpClient = new DefaultHttpClient();
// restore cookie
if (sCookieStore != null) {
httpClient.setCookieStore((org.apache.http.client.CookieStore) sCookieStore);
}
//request.addHeader("Host", "localhost");
HttpResponse response = httpClient.execute(request);
StringBuilder builder = new StringBuilder();
BufferedReader reader = new BufferedReader(new InputStreamReader(
response.getEntity().getContent()));
for (String s = reader.readLine(); s != null; s = reader.readLine()) {
builder.append(s);
}
result = builder.toString();
Log.d(TAG, "result is ( " + result + " )");
// store cookie
sCookieStore = (CookieStore) ((AbstractHttpClient) httpClient).getCookieStore();
return result;
}
public static String invokeGet(String action, List<NameValuePair> params) {
try {
StringBuilder sb = new StringBuilder(API_URL);
sb.append(action);
if (params != null) {
for (NameValuePair param : params) {
sb.append("?");
sb.append(param.getName());
sb.append("=");
sb.append(param.getValue());
}
}
Log.d(TAG, "url is" + sb.toString());
//HttpGet httpGet = new HttpGet(URLEncoder.encode(sb.toString(), "UTF-8"));
HttpGet httpGet = new HttpGet(sb.toString());
return invoke(httpGet);
} catch (Exception e) {
Log.e(TAG, e.toString());
}
return null;
}
public static String invokeGet(String action) {
return invokeGet(action, null);
}
nextResult
变量应得到以下结果:
public bool Get(String userName, String userPassword)
{
Task<IdentityUser> iu = _repo.FindUser(userName, userPassword);
if (iu != null)
{
FormsAuthentication.SetAuthCookie(userName, false);
return true;
}
return false;
}
[HttpGet]
[AllowAnonymous]
public async Task<IHttpActionResult> RegisterUser(String userName, String userPassword, String huh)
{
UserModel userModel = new UserModel();
userModel.ConfirmPassword = userPassword;
userModel.UserName = userName;
userModel.Password = userPassword;
String userID = "";
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
IdentityResult result = await _repo.RegisterUser(userModel);
IHttpActionResult errorResult = GetErrorResult(result);
if (errorResult != null)
{
return errorResult;
}
else
{
Task<IdentityUser> iu = _repo.FindUser(userModel.UserName, userModel.Password);
using (var context = new AuthContext())
{
var userStore = new UserStore<IdentityUser>(context);
var userManager = new UserManager<IdentityUser>(userStore);
userID = iu.Result.Id;
result = await userManager.AddToRoleAsync(userID, "Users");
errorResult = GetErrorResult(result);
if (errorResult != null)
{
return errorResult;
}
}
}
return Ok("userID:" + userID);
}
[HttpGet]
[异名]
公共异步任务注册器(字符串用户名、字符串用户密码、字符串密码)
{
UserModel UserModel=新的UserModel();
userModel.ConfirmPassword=用户密码;
userModel.UserName=用户名;
userModel.Password=userPassword;
字符串userID=“”;
如果(!ModelState.IsValid)
{
返回请求(ModelState);
}
IdentityResult result=wait _repo.RegisterUser(userModel);
IHttpActionResult errorResult=GetErrorResult(结果);
if(errorResult!=null)
{
返回错误结果;
}
其他的
{
Task iu=_repo.FindUser(userModel.UserName,userModel.Password);
使用(var context=new AuthContext())
{
var userStore=新的userStore(上下文);
var userManager=newusermanager(userStore);
userID=iu.Result.Id;
结果=wait userManager.AddToRoleAsync(userID,“Users”);
errorResult=GetErrorResult(结果);
if(errorResult!=null)
{
返回错误结果;
}
}
}
返回Ok(“userID:+userID”);
}
看起来authResult将触发invokeGet两次,并给出相同的参数(this.URL)。在invokeGet中,变量sb在函数激发的两次都是this.URL
这对我来说有点奇怪:
// restore cookie
if (sCookieStore != null) {
httpClient.setCookieStore((org.apache.http.client.CookieStore) sCookieStore);
}
然后最后,
// store cookie
sCookieStore = (CookieStore) ((AbstractHttpClient) httpClient).getCookieStore();
什么时候定义sCookieStore?这可能是因为cookies没有得到正确处理,而您正在建立两个新的连接。如果问题在于获取和设置cookie,那么最好在调用开始时获取cookie,然后在调用结束时设置新的cookie 我假设您找到了正确的URL,并使用curl测试了它们的回复,对吗?另外,请注意,(NameValuePair-param:params){sb.append(“?”);的
上有一个bug。
(您现在跳过该分支,但稍后会遇到)@Vlad-我使用的API是用.NET MVC编写的。我通过Visual Studio 2013对它进行了测试,所有的东西都运行得很好。我刚才包含的NameValuePair是因为,到目前为止,我还没有使用该方法的那部分来传递参数。所以我甚至还没有调试该部分代码。只是因为我正在使用另一个invokeGet并传递null。authResult不会触发invokeGet 2次。初始调用是为了验证用户。然后根据URL,如果它包含单词register,它会执行它的操作。这将在稍后更改为invokePost,但仅用于测试目的,以使代码正常工作并因此,我也可以通过浏览器进行测试。sCookieStore是该静态类的静态变量。我需要将该cookie传递给每个请求,因为初始用户验证设置了该变量,然后将通过API用于后续请求的授权。此外,我还通过android中的调试器和invo中的调试器进行了检查ke方法,对于请求变量,它确实显示了每个实例使用的正确URL。很抱歉,我不清楚我的意思——从您的描述中,听起来好像您多次触发authResult。是这样吗?它的描述方式与我提到的持有va的nextResult相同,只是顶部使用了不同的措辞authResult的值,当它应该持有用户ID时。调试器中的所有内容都显示,在点击execute命令之前,每个请求都有相应的URL值。这就是返回的结果。因此httpClient,至少在变量本身中,拥有所有正确的信息。从它发送的点开始并且返回是发生混淆的地方。至少,从我调试中看到的情况来看。我完全删除了cookie的设置,只是为了确保不会导致任何打嗝,并且相同的结果再次发生。因此,导致混淆的不是httpClient上的cookie关联。
// store cookie
sCookieStore = (CookieStore) ((AbstractHttpClient) httpClient).getCookieStore();