gpt4 book ai didi

android - 使用 Basic Auth 的 POST 在 Android 上失败但在 C# 中有效

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:08:07 25 4
gpt4 key购买 nike

我有一个正在开发的应用程序需要我将数据发布到第 3 方 API。我从一开始就在身份验证方面苦苦挣扎,而且拖得越来越远,现在我被困住了。

我曾尝试使用 Authenticator,但已阅读所有有关某些 Android 版本中似乎存在错误的信息:Authentication Example

我尝试了几种不同的选择,包括 Apache Commons HTTP Library 但没有成功。在这一切之后,我决定确保 API 不是痛点。因此,我编写了一个快速的 WinForms 程序来测试 API,它在第一次尝试时运行良好。因此,我的想法和我使用的 API 看起来都不错,但我迫切需要一些指导来解释为什么 Java 代码不起作用。

示例如下:

每次都有效的 C# 代码:

        System.Net.ServicePointManager.Expect100Continue = false;
// Create a request using a URL that can receive a post.
WebRequest request = WebRequest.Create(addWorkoutUrl);
// Set the Method property of the request to POST.
request.Method = "POST";
// Create POST data and convert it to a byte array.
string postData = "distance=4000&hours=0&minutes=20&seconds=0&tenths=0&month=08&day=01&year=2011&typeOfWorkout=standard&weightClass=H&age=28";
byte[] byteArray = Encoding.UTF8.GetBytes(postData);
// Set the ContentType property of the WebRequest.
request.Headers["X-API-KEY"] = apiKey;
request.Headers["Authorization"] = "Basic " + Convert.ToBase64String(Encoding.Default.GetBytes("username:password"));
request.ContentType = "application/x-www-form-urlencoded";
// Set the ContentLength property of the WebRequest.
request.ContentLength = byteArray.Length;
// Get the request stream.
Stream dataStream = request.GetRequestStream();
// Write the data to the request stream.
dataStream.Write(byteArray, 0, byteArray.Length);
// Close the Stream object.
dataStream.Close();
// Get the response.
WebResponse response = request.GetResponse();
// Display the status.
MessageBox.Show(((HttpWebResponse)response).StatusDescription);
// Get the stream containing content returned by the server.
dataStream = response.GetResponseStream();
// Open the stream using a StreamReader for easy access.
StreamReader reader = new StreamReader(dataStream);
// Read the content.
string responseFromServer = reader.ReadToEnd();
// Display the content.
MessageBox.Show(responseFromServer);
// Clean up the streams.
reader.Close();
dataStream.Close();
response.Close();

目前返回 500:Internal Server Error 的 Android Java 代码,尽管我认为这是我的错。

    URL url;
String data = "distance=4000&hours=0&minutes=20&seconds=0&tenths=0&month=08&day=01&year=2011&typeOfWorkout=standard&weightClass=H&age=28";
HttpURLConnection connection = null;
//Create connection
url = new URL(urlBasePath);
connection = (HttpURLConnection)url.openConnection();
connection.setConnectTimeout(10000);
connection.setUseCaches(false);
connection.setRequestProperty("User-Agent","Mozilla/5.0 ( compatible ) ");
connection.setRequestProperty("Accept","*/*");
connection.setRequestProperty("X-API-KEY", apiKey);
connection.setRequestProperty("Authorization", "Basic " +
Base64.encode((username + ":" + password).getBytes("UTF-8"), Base64.DEFAULT));
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
connection.setRequestProperty("Content-Length", "" + Integer.toString(data.getBytes("UTF-8").length));

DataOutputStream wr = new DataOutputStream(connection.getOutputStream());
wr.write(data.getBytes("UTF-8"));
wr.flush();
wr.close();
statusCode = connection.getResponseCode();
statusReason = connection.getResponseMessage();
//At this point, I have the 500 error...

最佳答案

我弄清楚了问题所在,并在偶然发现上面评论中提到的根本原因后终于找到了解决方案。

我在示例中使用了 Base64.encode(),但我需要使用 Base64.encodeToString()

区别在于 encode() 返回一个 byte[]encodeToString() 返回一个 string我在期待。

希望这能帮助其他遇到此问题的人。

关于android - 使用 Basic Auth 的 POST 在 Android 上失败但在 C# 中有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6947015/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com