- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是 Android 开发的新手,我正在尝试使用“身份验证方法 -> POST https://notify-api.line.me/api/notify”(LINE Notify API Document)向 LINE 通知服务发送消息
这是我的代码,我总是得到
Return status code: -1
.请帮我找出问题出在哪里?
LINENotify.java
package com.example.test3;
import java.io.BufferedWriter;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import javax.net.ssl.HttpsURLConnection;
public class LINENotify {
private static final String strEndpoint = "https://notify-api.line.me/api/notify";
private static final String tokenKEY = "ldO3dTIAjT5OpjWbeZAQtnXhq23poCXcEAvKoTwJHhn";
public int sendMSG( String message ) {
int statusCode;
statusCode = -1;
try {
URL url = new URL( strEndpoint );
HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
connection.setRequestMethod( "POST" );
connection.addRequestProperty("Authorization", "Bearer " + tokenKEY);
connection.addRequestProperty("Content-Type", "application/x-www-form-urlencoded");
connection.setConnectTimeout(15*1000);
connection.setDoOutput( true );
connection.setUseCaches( false );
connection.connect();
connection.setReadTimeout(15*1000);
connection.setDoInput( true );
OutputStream os = connection.getOutputStream();
BufferedWriter writer = new BufferedWriter( new OutputStreamWriter( os, "UTF-8") );
writer.write( "message=" + message );
writer.flush();
writer.close();
os.close();
statusCode = connection.getResponseCode();
if ( statusCode == 200 ) {
//
} else {
throw new Exception( "Error:(StatusCode)" + statusCode + ", " + connection.getResponseMessage() );
}
connection.disconnect();
} catch (Exception e) {
e.printStackTrace();
}
return statusCode;
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<EditText
android:id="@+id/editText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:inputType="textPersonName"
android:text="Name" />
<Button
android:id="@+id/button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Button" />
</LinearLayout>
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.test3">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
</manifest>
MainActivity.java
package com.example.test3;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
EditText msg;
Button send;
LINENotify lineNotify;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
msg = (EditText) findViewById(R.id.editText);
send = (Button) findViewById(R.id.button);
lineNotify = new LINENotify();
send.setOnClickListener(this);
}// onCreate
@Override
public void onClick(View v) {
switch( v.getId() ) {
case R.id.button: {
int statusCode = lineNotify.sendMSG( msg.getText().toString() );
Toast.makeText(this, "Return status code: " + statusCode, Toast.LENGTH_LONG).show();
break;
}
}
}
}
最佳答案
我得到了答案!感谢谷歌和发布他们的经验和笔记的人。
我的失败是
Android Developers -> Docs -> Connect to the network
To avoid creating an unresponsive UI, don't perform network operations on the UI thread. By default, Android 3.0 (API level 11) and higher requires you to perform network operations on a thread other than the main UI thread;
因此,我尝试使用AsyncTask来解决问题。
MainActivity.java
package com.example.test3;
import androidx.appcompat.app.AppCompatActivity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
EditText msg;
Button send;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
msg = (EditText) findViewById(R.id.editText);
send = (Button) findViewById(R.id.button);
send.setOnClickListener(this);
}// onCreate
@Override
public void onClick(View v) {
switch( v.getId() ) {
case R.id.button: {
new LINENotify().execute(msg.getText().toString());
break;
}
}
}
public class LINENotify extends AsyncTask<String, Integer, String> {
private static final String strEndpoint = "https://notify-api.line.me/api/notify";
private static final String tokenKEY = "ldO3dTIAjT5OpjWbeZAQtnXhq23poCXcEAvKoTwJHhn";
String result = "";
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected String doInBackground(String... strings) {
String message = strings[0];
try {
URL url = new URL( strEndpoint );
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod( "POST" );
connection.addRequestProperty("Authorization", "Bearer " + tokenKEY);
connection.addRequestProperty("Content-Type", "application/x-www-form-urlencoded");
connection.setConnectTimeout(15*1000);
connection.setDoOutput( true );
connection.setUseCaches( false );
connection.setReadTimeout(15*1000);
connection.setDoInput( true );
OutputStream os = connection.getOutputStream();
OutputStreamWriter writer = new OutputStreamWriter(os, "UTF-8");
writer.write( "message=" + message );
writer.flush();
writer.close();
os.close();
connection.connect();
result = connection.getResponseMessage();
connection.disconnect();
} catch (IOException error) {
// Handles input and output errors
}
return result;
}
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
}
}
}
一些引用链接:
How to fix 'android.os.NetworkOnMainThreadException'?
AsyncTask Android example
[Android] AsyncTask - 非同步任務
【Android】AsyncTask - Thread 外的另一選擇
关于java - 向 LINE Notify 发送消息失败(使用 HttpsURLConnection POST),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59450421/
我有一个在 eclipse 中开发的类(在同一台计算机上),我正试图将它带到 Android Studio 中。 Android Studio 给我一个错误,它无法解析符号 HttpsURLConne
我试图使这个curl请求从Java可执行: curl -H 'Accept: application/vnd.twitchtv.v2+json' \ -d "channel[status]=testi
我正在使用 HttpsURLConnection 连接客户端应用程序。我正在为 1 个用户请求发送多个请求(例如登录、dosearch 和 getResult)。 对于第一个用户的请求(服务器第一个请
我必须每 5 分钟从我的 Minecraft 服务器向其他服务器 (Https) 中的 API 发出 https 请求,以交换 secret 信息。此 Java 代码是否足够安全,能够抵御中间人攻击?
我正在尝试根据 How do a send an HTTPS request through a proxy in Java? 使用代理访问 https 网页 但是我遇到了一个奇怪的问题:HttpsU
我创建了一个HttpsURLConnection,如下所示: try { URL url = new URL( host );
我有一个简单的客户端-服务器应用程序,它通过 REST API 下载文件。当我使用基本的 http 身份验证时,文件是通过 ssl 发送的。 //my download loop HttpsURLCo
我尝试过解决这个问题,但没有找到好的解决方案。我刚刚用 httsurlconnection 打开了一个套接字并关闭了。但是,我打开的套接字没有关闭,并且套接字状态为 CLOSE_WAIT。这是我的代码
我正在尝试使用 HttpsURLConnection 与网站建立 HTTPS 连接,然后执行 PUT 请求。当我尝试从 HttpsURLConnection.getOutputStream() 创建
我正在使用以下代码进行发布请求 public String executeHttpPost(String uri, String data) { HttpURLConnection conn
我有一个针对 ICS 及更高版本的应用程序,我正在尝试使用 HttpsURLConnection 和 HttpResponseCache 来缓存网络服务响应。它使用 etag 发出请求,如果未修改,服
我是 android 编程的新手。我遵循了 api 示例 https://developer.android.com/reference/java/net/HttpURLConnection.html
我正在尝试向服务器发送客户端证书。我正在 HttpURLConnection 上构建 SSLSocketFactory。 我认为我需要通过 SSLSocketFactory 知道的 KeyManage
我的代码向网站发出 POST 请求,但响应看起来像是加密的,带有奇怪的字符。当我将我的应用配置为使用 fiddler 代理时,响应有效。我怎样才能让我的应用解密这个响应? public class L
我编写了一个应用程序来测试 servlet 的性能。我编写的代码可以很好地满足某些请求。如果我增加更多连接,有时我会收到“写入字节数过多”异常。 int startRange = 0, endRang
我正在尝试制作一个固定 ssl 证书的应用程序。我有一个使用 HttpsURLConnection 创建服务器连接的类。当我使用普通互联网连接进行连接时,它连接正常。当我使用代理 (mitmproxy
这个问题在这里已经有了答案: Get SSL Version used in HttpsURLConnection - Java (1 个回答) 关闭 5 年前。
我有一个使用 HttpsUrlConnection 执行 POST 请求的代码,该代码工作正常,但我的一些用户拥有带有封闭用户组的 SIM 卡,他们需要在他们的 apn 设置中设置代理。如果他们设置代
我遇到了似乎无法解决的 HttpsURLConnection 问题。基本上,我正在向服务器发送一些信息,如果其中一些数据有误,服务器会向我发送一个 500 响应代码。但是,它还在响应中发送了一条消息,
我希望有人可以帮助我解决间歇性连接问题通过 HttpsURLConnection 使用代码。我使用的代码是下面: HttpsURLConnection conn = (HttpsURLConnecti
我是一名优秀的程序员,十分优秀!