Android-带有基本身份验证的HttpClient JSON POST

Android-带有基本身份验证的HttpClient JSON POST,json,httpclient,Json,Httpclient,我正在尝试在ANDROID上实现一个简单的JSONpost到接受JSON的URL,并在ANDROID上进行基本身份验证 我尝试了HttpUrlConnection,但我得到了“未经授权”,我的数据被发送到服务器 我尝试的另一种方法是使用HttpClient,但现在我遇到了另一个问题。身份验证工作正常,但数据未发送到服务器 为了确保这一点,我在一个简单的Java项目(不是Android环境)中设置了一个小测试 这是我用来将发布到服务器的代码: DefaultHttpClient httpClien

我正在尝试在
ANDROID
上实现一个简单的
JSON
post到接受
JSON
的URL,并在
ANDROID
上进行基本身份验证

我尝试了
HttpUrlConnection
,但我得到了
“未经授权”
,我的数据被发送到服务器

我尝试的另一种方法是使用
HttpClient
,但现在我遇到了另一个问题。身份验证工作正常,但数据未发送到服务器

为了确保这一点,我在一个简单的Java项目(不是Android环境)中设置了一个小测试

这是我用来将发布到服务器的代码:

DefaultHttpClient httpClient = new DefaultHttpClient();
ResponseHandler<String> resonseHandler = new BasicResponseHandler();
HttpPost postMethod = new HttpPost("http://localhost/api/v1/purchase/");    
postMethod.setEntity(new StringEntity("{\"amount_adult\" : 1, \"object_id\" : 13}"));
postMethod.setHeader( "Content-Type", "application/json");
String authorizationString = "Basic " + Base64.encodeToString(("travelbuddy" + ":" + "travelbuddy").getBytes(), Base64.DEFAULT); //this line is diffe
postMethod.setHeader("Authorization", authorizationString);
String response = httpClient.execute(postMethod,resonseHandler);
System.out.println("response :" + response);

我认为你不应该在url中使用localhost。最后,一切都排序好了。任何可能遇到以下问题的人都可以找到解决方案

String authorizationString = "Basic " + Base64.encodeToString(("travelbuddy" + ":" + "travelbuddy").getBytes(), Base64.DEFAULT); //this line is diffe
postMethod.setHeader("Authorization", authorizationString);
此Base64.encodeToString在授权字符串的末尾追加一个额外的“\n”。然后在服务器上“\n”后面的下一行字符被视为请求的主体,当然不正确

通过替换授权字符串中的所有新行,将解决此问题:

    String authorizationString = "Basic " + Base64.encodeToString(("travelbuddy" + ":" + "travelbuddy").getBytes(), Base64.DEFAULT); //this line is diffe
authorizationString.replace("\n", "");
    postMethod.setHeader("Authorization", authorizationString);
容易修复但很难找到;-)

解决方案实际上更简单一些:

    String authorizationString = "Basic " + Base64.encodeToString(
        ("travelbuddy" + ":" + "travelbuddy").getBytes(),
        Base64.NO_WRAP); // <=== Do not add '\n'
String authorizationString=“Basic”+Base64.encodeToString(
(“travelbuddy”+”:“+”travelbuddy”).getBytes(),

Base64.无包装);// 我认为最简单的方法是:

postMethod.addHeader(BasicScheme.authenticate(new UsernamePasswordCredentials(user, pass), "UTF-8", false));

感谢您的回复,我刚才在代码“localhost”中说明了这一点,实际上我使用的是域的完整路径。在您看来,这是向服务器发送JSON正文的正确方法吗?也许只是一个模拟器不起作用?你的代码是对的。如果您在Emulator中进行测试,请改用IP地址10.0.2.2。请参阅。实际上我没有使用本地主机或任何本地网络地址。我正在使用适当的托管域名,这是公开的。这可能是Emulator的问题吗?我只是没有电话要测试。我不知道发生了什么…请确保您可以在Emulator中访问internet。您可以在浏览器中查看谷歌网站进行测试。如果您无法访问internet,请参阅我必须添加
“”+authorizationString+“”
,以使其正常工作(HTTP请求无效)。这是哪个库?我看不到。没有包装me@qaispak问题中提到了,所以我猜这是已知的。至少谷歌知道,
    String authorizationString = "Basic " + Base64.encodeToString(
        ("travelbuddy" + ":" + "travelbuddy").getBytes(),
        Base64.NO_WRAP); // <=== Do not add '\n'
postMethod.addHeader(BasicScheme.authenticate(new UsernamePasswordCredentials(user, pass), "UTF-8", false));