无法使用loopj AsyncHttpClient和授权标头

时间:2015-07-17 04:27:07

标签: android json asynchttpclient android-async-http loopj

我正在使用loopj(1.4.7)和AsyncHttpClient将Json发布到Web API服务器。我的(简化)代码是:

private void createCode() {
    // 1. Get the current data and time
    DateFormat df = DateFormat.getDateTimeInstance();
    df.setTimeZone(TimeZone.getTimeZone("UTC"));
    String gmtTime = df.format(new Date());

    // 2. Setup few things
    AsyncHttpClient client = new AsyncHttpClient();
    Context context = this.getApplicationContext();
    connCode = "1234";

    JSONObject jsonData = new JSONObject();
    try {
        jsonData.put("ClientCode", connCode);
        jsonData.put("CodeCreated", gmtTime);
    } catch (Exception ex) {
        // Should not really happen
    }

    // 3. Authorization/Authentication
    String userName = "TestUser";
    String userPassword = "TestPassword";
    String userNamePassword = userName + ":" + userPassword;
    byte[] loginString = userNamePassword.getBytes();
    String loginStringEncoded = Base64.encodeToString(loginString, Base64.DEFAULT);

    client.setAuthenticationPreemptive(true);

    // This is the line that cause the problem
    client.addHeader("Authorization", loginStringEncoded);

    // 4. Setup various options
    StringEntity entity = null;
    try {
        entity = new StringEntity(jsonData.toString());
    } catch (UnsupportedEncodingException e) {
        return;
    }
    entity.setContentType(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));

    // 5. Post the code to the database
    client.post(context, CODE_URL, entity, "application/json", new JsonHttpResponseHandler() {

        @Override
        public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
            // TODO - Process results...
        }

        @Override
        public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) {
        }

        @Override
        public void onFailure(int statusCode, Header[] headers, java.lang.Throwable throwable, org.json.JSONArray errorResponse) {
        }

        @Override
        public void onFailure(int statusCode, Header[] headers, java.lang.Throwable throwable, org.json.JSONObject errorResponse) {
        }
    });
}

响应是“400 - Bad Request”,因为如果我使用"Authorization"标头,并不是所有内容都会进入服务器。服务器上显示的内容(使用Fiddler验证):

{"ClientCode":"1234","CodeCreated":"Jul 17, 2015 1:03:00 AM

如果我摆脱"client.addHeader("Authorization", loginStringEncoded);"行,一切正常,服务器收到所有内容(但我需要授权标头来限制访问):

{"ClientCode":"1234","CodeCreated":"Jul 17, 2015 1:10:00 AM"}

我可以说服务器正在正确处理授权,但由于缺少"}" ,响应失败。在“client.post”命令执行之前,我已经验证整个字符串是“entity”变量的一部分。

如果它有所不同,我在Mac上运行Android Studio,并且我已使用WireShark验证了缺少的"}" 已经不存在当Mac连接到Web API server时。 可能是什么原因造成的?类似的设置适用于GET,但我无法使其适用于POST。有没有更好的方法来做到这一点? 感谢。

1 个答案:

答案 0 :(得分:1)

这对我有用:

l

我希望它会对你有所帮助。