我正在使用 Okhttp3 模块通过 Android 客户端和服务器进行 http 请求训练。我已经使用了 get 请求,没有任何问题,但是当我尝试 post 请求时,它们无法到达服务器。
使用我验证的一些 Log.d 格式不正确,并且服务器要求 application/json 主体,但对我来说,看起来我做的一切都是正确的。我打开了这个选项
android:usesCleartextTraffic="true"
在清单中以避免因缺乏加密而被阻止。 我还尝试了 enqueue() 方法而不是 execute() 作为 post 请求的异步方法,但它无论如何都不起作用,我不明白为什么我应该以同步方式发送我的请求,因为我不需要它,所以我切换回来 这是代码
JSONObject jsonObject = new JSONObject();
jsonObject.put("user", "IP-Alby");
jsonObject.put("password", "blabla");
RequestBody requestBody = RequestBody.create(
jsonObject.toString(),
MediaType.parse("application/json; charset=utf-8")
);
Log.d("NetworkRequest", "request created");
Request postRequest = new Request.Builder().url("http://x.x.x.x:25565/api/register").post(requestBody).build();
Response response = client.newCall(postRequest).execute();
int statusCode = response.code();
Log.d("NetworkRequest", "status code: "+statusCode);
String responseBody = response.body().string();
Log.d("NetworkRequest", "Response Body: " + responseBody);
if (response.isSuccessful()) {
Log.d("NetworkRequest", "POST was correct");
String responseBody2 = response.body().string();
Log.d("NetworkRequest", responseBody2);
}
if (!response.isSuccessful()) {
Log.e("NetworkRequest", "something went wrong");
}
这是我得到的经过过滤的 LogCat 响应
D request created
D status code: 400
D Response Body: Expected application/json content type
E something went wrong
如果您注意到,它不会触发response.isSuccesful() 我会避免考虑网址拼写错误,因为我已经以其他方式测试了它,并且它有效,只是在这个应用程序上它让我头痛。 有什么帮助吗?正文内容格式正确吗?
基于此错误:
Response Body: Expected application/json content type
我假设您的请求需要在请求标头中定义此内容。这个特定的标头需要添加到
postRequest
对象中。尝试用以下内容替换您的 postRequest
构建器:
Request postRequest = new Request.Builder()
.url("http://x.x.x.x:25565/api/register")
.post(requestBody)
.headers(new Headers.Builder()
.add("Content-Type", "application/json")
.build())
.build();
我已经有一段时间没有写 Java 代码了,但我认为那是正确的。这里的重点是确保您将正确的
headers
添加到 Request.Builder()
。