【发布时间】:2014-11-17 14:43:38
【问题描述】:
我在一个名为 HttpHelper 的类中拥有这些方法。现在初始调用验证用户凭据并返回 true。这是意料之中的。下一个调用是注册用户。这似乎很顺利,没有打嗝,是返回新的用户 ID。它不再返回用户 ID,而是再次返回 true。几乎就像它被缓存并且只是从初始调用返回结果。有人对为什么会发生这种情况有任何想法吗?
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);
}
这是我正在拨打的电话。如上所述,authResult 变量将导致字符串结果为真。 nextResult 应该保存用户 ID 值,而是像初始请求一样保存值 true:
String authResult = HttpHelper.invokeGet("<url to validate user>");
if (this.URL.indexOf("register") > -1)
String nextResult = HttpHelper.invokeGet(this.URL);
else
String nextResult = HttpHelper.invokeGet(this.URL);
更新:添加到sCookieStore 变量中。
更新 2:添加通过 API (MVC .NET) 调用的方法:
authResult 变量会得到这个结果:
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;
}
nextResult 变量应该得到这个结果:
[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);
}
【问题讨论】:
-
我假设您点击了正确的 URL 并使用 curl 测试了他们的回复,对吧?另外,请注意您在
for (NameValuePair param : params) { sb.append("?");..处有一个错误(您现在正在跳过该分支,但稍后会遇到)。 -
@Vlad - 我使用的 API 是用 .NET MVC 编写的。我通过 Visual Studio 2013 对其进行了测试,那里一切正常。我刚刚包含的 NameValuePair 是因为到目前为止,我什至还没有使用该方法的那一部分来传递参数。所以我什至还没有调试过那部分代码。仅由于我当前正在使用的另一个 invokeGet 和传递 null 而添加。