Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 后续的httpClient调用返回初始调用结果_Java_Androidhttpclient - Fatal编程技术网

Java 后续的httpClient调用返回初始调用结果

Java 后续的httpClient调用返回初始调用结果,java,androidhttpclient,Java,Androidhttpclient,我在一个名为HttpHelper的类中有这些方法。现在,初始调用验证用户凭据并返回true。这是意料之中的。下一个调用是注册一个用户。这似乎没有问题,返回新的用户ID。它不再返回用户ID,而是再次返回true。就像它被缓存了一样,只是从初始调用返回结果。有人知道为什么会发生这种情况吗 private static CookieStore sCookieStore; private static String invoke(HttpUriRequest request)

我在一个名为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);
    }
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();