Java HttpUrlConnection未连接到服务器
我是Android开发的新手,通过在互联网上的一些咨询,我想出了以下代码来连接Url,发布字符串内容并读取其响应Java HttpUrlConnection未连接到服务器,java,android,Java,Android,我是Android开发的新手,通过在互联网上的一些咨询,我想出了以下代码来连接Url,发布字符串内容并读取其响应 private static java.lang.String getRequest(java.lang.String Url, java.lang.String PostContent) { java.lang.StringBuilder content = new java.lang.StringBuilder(); try { java.
private static java.lang.String getRequest(java.lang.String Url, java.lang.String PostContent)
{
java.lang.StringBuilder content = new java.lang.StringBuilder();
try
{
java.lang.String line;
java.net.URL url = new java.net.URL(Url);
if (cweb.companion.MainActivity.url.startsWith("https"))
{
javax.net.ssl.HttpsURLConnection httpsConnection = (javax.net.ssl.HttpsURLConnection)url.openConnection();
httpsConnection.setSSLSocketFactory((javax.net.ssl.SSLSocketFactory)javax.net.ssl.SSLSocketFactory.getDefault());
httpsConnection.setRequestMethod("POST");
httpsConnection.setDoOutput(true);
httpsConnection.setRequestProperty("Content-Type", "text/plain");
httpsConnection.addRequestProperty("Content-Length", java.lang.String.valueOf(PostContent.length()));
java.io.OutputStreamWriter wr = new java.io.OutputStreamWriter(httpsConnection.getOutputStream());
wr.write(PostContent);
wr.flush();
wr.close();
java.io.BufferedReader bufferedReader = new java.io.BufferedReader(new java.io.InputStreamReader(httpsConnection.getInputStream()));
while ((line = bufferedReader.readLine()) != null) { content.append(line + "\n"); }
bufferedReader.close();
}
else
{
java.net.HttpURLConnection httpConnection = (java.net.HttpURLConnection)url.openConnection();
httpConnection.setRequestMethod("POST");
httpConnection.setDoOutput(true);
httpConnection.setRequestProperty("Content-Type", "text/plain");
httpConnection.addRequestProperty("Content-Length", java.lang.String.valueOf(PostContent.length()));
java.io.OutputStreamWriter wr = new java.io.OutputStreamWriter(httpConnection.getOutputStream());
wr.write(PostContent);
wr.flush();
wr.close();
java.io.BufferedReader bufferedReader = new java.io.BufferedReader(new java.io.InputStreamReader(httpConnection.getInputStream()));
while ((line = bufferedReader.readLine()) != null) { content.append(line + "\n"); }
bufferedReader.close();
}
return content.toString();
} catch (java.lang.Exception e) { return "ERROR{" + e.getMessage() + "}"; }
}
我让它非常“重复”以帮助我调试(我知道它可以将一些代码推送到其他方法)
该代码位于MainActivity中,实现如下:
public class MainActivity extends androidx.appcompat.app.AppCompatActivity
{
private static java.lang.String getRequest(java.lang.String Url, java.lang.String PostContent)
{
//my code (as posted earlier)
}
@Override protected void onCreate(android.os.Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
this.setContentView(R.layout.activity_main);
//here i call the code to something like:
java.lang.String retHTTP = getRequest("http://httpaddress.example.com", "hello world!");
java.lang.String retHTTPS = getRequest("https://httpsaddress.example.com", "hello world!");
}
}
如果我以HTTPS地址为目标,则函数抛出空异常并结束(异常的getMessage()方法为null/空字符串),如果它以HTTP地址为目标,则会给我一条“不允许本地主机的明文HTTP流量”消息
我的舱单和Gradle是这样的:
public class MainActivity extends androidx.appcompat.app.AppCompatActivity
{
private static java.lang.String getRequest(java.lang.String Url, java.lang.String PostContent)
{
//my code (as posted earlier)
}
@Override protected void onCreate(android.os.Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
this.setContentView(R.layout.activity_main);
//here i call the code to something like:
java.lang.String retHTTP = getRequest("http://httpaddress.example.com", "hello world!");
java.lang.String retHTTPS = getRequest("https://httpsaddress.example.com", "hello world!");
}
}
清单
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:targetSandboxVersion="1" package="cweb.companion">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<application
android:usesCleartextTraffic="true"
android:allowBackup="true"
android:icon="@drawable/logo_standard"
android:label="@string/app_name"
android:roundIcon="@drawable/logo_standard"
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>
</manifest>
那么,为什么连接没有发生(我也有服务器端代码,在这两种情况下,甚至没有向它发送任何东西)?对于HTTP请求,正如您所说,您已将安全配置添加到项目中,那么这里是工作HTTP调用
。。。
java.net.URL URL=新的java.net.URL(URL);
...
其他的
{
HttpURLConnection conn=(HttpURLConnection)url.openConnection();
连接设置连接超时(5000000);
conn.setRequestProperty(“内容类型”、“文本/普通;字符集=UTF-8”);
连接设置输出(真);
conn.setDoInput(真);
conn.setRequestMethod(“POST”);
OutputStream os=conn.getOutputStream();
写(PostContent.getBytes(“UTF-8”);
os.close();
//阅读回复
InputStream in=新的BufferedInputStream(conn.getInputStream());
字符串结果=IOUtils.toString(在“UTF-8”中);
连接断开();
返回结果;
}
}catch(java.lang.Exception e){return“ERROR{”+e.getMessage()+“}”;}
...
现在考虑在后台线程上进行网络操作,这样您可以按如下方式调用GETRebug方法。
创建时受保护的void(android.os.Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
this.setContentView(R.layout.activity_main);
//在这里,您可以调用类似于后台线程的代码:
新建异步任务(){
@凌驾
受保护的空位背景(空位…空位){
java.lang.String retHTTP=getRequest(“http://httpaddress.example.com“,“你好,世界!”);
返回null;
}
}.executeOnExecutor(异步任务.THREAD\u池\u EXECUTOR);
}
同样,您也可以使用SSL成功使用HTTPS
注意:对app.gradle文件中的IOUtils使用
implementation'org.apache.commons:commons io:1.3.2'
。如果您使用或使用其他客户端库,将非常容易。很少几行代码可以满足您的需要。我不使用HttpUrlConnection
,但是每个Http调用都不应该在主线程上完成。这就是行不通。但是是的,改型
将是更好的选择,它甚至有内置的线程处理。@Afsaredrisy可能,但我对这个IDE和语言很熟悉,所以合并很复杂,但它不会工作吗?有什么问题吗?@SkypeDogg不知道,所以必须在另一个类中?只需在AsyncTask
内部调用,即使在同一个活动中,所有内容都冻结在conn.getOutputStream()中,但仍在处理它-我将在用尽所有尝试后立即用代码更改更新我的问题!虽然没有添加实现标记,但是使用了xml解决方案,只添加了标记(没有域标记)-最终与您的文章不完全一样,但是从中获得了很多信息,同时也为“how to do asynctask”文章带来了很多信息。谢谢大家的帮助!