我正在尝试使用OKHTTP库向服务器发送令牌,但我没有收到应用程序发送的帖子请求。
我已经在我的清单中添加了互联网许可。
private void registerToken(String token) {
final OkHttpClient client = new OkHttpClient();
RequestBody formBody = new FormBody.Builder()
.add("token", token)
.build();
Request request = new Request.Builder()
.url("http://####/push_notifcation/index.php")
.post(formBody)
.build();
try {
Response response = client.newCall(request).execute();
Log.i(TAG, "ok");
Log.i(TAG, response.message());
} catch (IOException e) {
e.printStackTrace();
Log.i(TAG, e.getMessage());
Log.i(TAG, "nok");
}
}
服务器
if(isset($_POST["token"])){
$token = $_POST["token"];
$db_data = $database->insert("tokens", [
"token" => $token
]);
}
答案 0 :(得分:1)
您的代码看起来正确,因此需要更多信息。根据提供的内容,我最好的猜测是将http重定向到https,并且可能会丢失POST主体或其他内容。
一种帮助调试的方法是添加一个记录HTTP请求的NetworkInterceptor
,以便您可以深入了解实际发生的情况。这是一个配置OkHttpClient logging
Logger logger = LoggerFactory.getLogger(HttpUtil.class);
HttpLoggingInterceptor logging =
new HttpLoggingInterceptor((msg) -> {
logger.debug(msg);
});
logging.setLevel(Level.BODY);
client.addNetworkInterceptor(logging);
如果您可以将调试输出添加到您的问题中,我们可以深入了解如果http没有问题 - > https重定向。
只需注释OkHttpClient
是线程安全的,并且可供许多线程使用。让一个OkHttpClient
重用(按照特定配置)是一种很好的做法。您可以使静态实例或依赖项将其注入。每个方法调用创建一个将有开销。
答案 1 :(得分:0)
试试这个
public static void send(JSONObject obj){
new OkHttpClient().newCall(new Request.Builder()
.addHeader("Content-Type", "application/json")
.url("URL...")
.post(RequestBody.create(
MediaType.parse("application/json; charset=utf-8"),
obj.toString())
).build())
.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.d("ZAKA",e.getMessage());
}
@Override
public void onResponse(Call call, Response response) throws IOException {
Log.d("ZAKA","Report : -> "+response.body().string());
}
});
}
然后调用它
JSObject obj = new JSObject();
obj.put("token","your token");
send(obj); // Call send method