51세부터 시작된 프로그래밍 메모 안드로이드에서 라벨로의 HttpURLConnection 연결
HttpURLConnection()
에 액세스하면D/NetworkSecurityConfig: No Network Security Config specified, using platform default
W/System.err: java.io.IOException: Cleartext HTTP traffic to 192.168.xxx.xxx not permitted
오류!192.168.xxx.xxx에서
cleartext Traffic Permitted가 false가 되었습니다!
그렇습니다.
Api29 이후 기본적으로cleartextTrafficPermitted는false이고 Https 연결이 아니면 잘못된 규격입니다.
■network_security_config.xml 설정
192.168.xxx.xxx의cleartextTrafficPermitted를 진짜로 만들어라!
android 프로젝트의 app\res에서 xml 폴더를 만듭니다. 그 중에서network_security_config.xml 파일을 만듭시다!
app/res/xml/network_security_config.xml
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">192.168.xxx.xxx</domain>
</domain-config>
</network-security-config>
API29 이후 위의 코드cleartextTrafficPermitted
는 기본값false
입니다.이것을 위의 코드처럼 true
, Http 연결도 Ok로 바꾸세요.여기는 도메인입니다. `http://www.@.@@@@'의 @@@.@지정!
■AndroidManifest.xml 설정
app/manifests/AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest ... >
<application android:networkSecurityConfig="@xml/network_security_config"
...>
...
</application>
</manifest>
■ Laravel 사이트에 연결된 코드
Laravel은 로컬 주소가 아닌 IP 주소로 연결됩니다.
웹 사이트지만 태그를 전혀 쓰지 않으면null로 돌아갑니다.예를 들어 파일에 Hello만 적힌 경우 등이다.read.readline () 예
public class MainActivity extends AppCompatActivity {
TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// オブジェクトを取得するよ!
Button button1 = findViewById(R.id.button1);
Button button2 = findViewById(R.id.button2);
textView = findViewById(R.id.textView);
// ボタン1はローカルにあるLaravelサイトに接続
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String site = "http://192.168.xxx.xxx:8000";
new httpConnectionAsync().execute(site);
}
});
// ボタン2はグーグル様に!
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String site = "https:www.google.co.jp";
new httpConnectionAsync().execute(site);
}
});
}
// 非同期通信でHttpURLConnection()で接続する!
private class httpConnectionAsync extends AsyncTask<String,Void,String> {
StringBuffer buffer;
@Override
protected String doInBackground(String... string) {
String site = string[0];
buffer = new StringBuffer();
try {
HttpURLConnection connection = (HttpURLConnection) new URL(site).openConnection();
BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
while(reader.readLine() != null){
buffer.append(reader.readLine());
}
reader.close();
connection.disconnect();
} catch (IOException e) {
e.printStackTrace();
}
return buffer.toString();
}
@Override
protected void onPostExecute(String stringBuffer){
textView.setText(stringBuffer);
}
}
}
■ 쿠키를 Laravel에서 Android에게 건네기
약간의 데이터 형식
Laravel에서$request = json_decode($request,true);
이런 문자열을 연상 배열로 바꾸는 편리한 방법으로 사용할 수 있습니다.android와laravel로 데이터를 교환할 때 json이 사용할 수 있는 형식입니다!
참고로 안드로이드에서senddata.put("key1","value1");
senddata.put("key2","value2");
などとして
HttpURLConnectionで
connection.addRequestProperty("senddata",String.balueoOf(senddata);
에서 보내면 Json 형식의 문자열로 보낼 수 있습니다.
그럼 쿠키!
AsyncTask 사용!
Laravel에서 setcookie를 설정하면% 인코딩
그래서 setrawcookie를 사용하여 쿠키를 보냅니다.
Laravel Route
Route
Route::get('/sample',function(){setrawcookie("param","laravel");});
Android
MyAsyncTaskpublic class MyAsyncTask extends AsyncTask<Void, Void, Map<String,List<String>>> {
@Override
protected Map<String,List<String>> doInBackground(Void... aVoid) {
try {
HttpURLConnection connection = (HttpURLConnection) new URL("https://www...").openConnection();
connection.connect();
Map<String,List<String>> header = connection.getHeaderFields();
connection.disconnect();
} catch (Exception e) {}
return header;
}
@Override
protected void onPostExecute(Map<String,List<String>> m) {
super.onPostExecute(m);
String param = m.get("Set-Cookie").get(0);
Log.d("------>", param);
}
}
Laravel에서 VarDump Header는 Android가 올바르게 취득할 수 없습니다.
Controllerpublic function sample(Request $request){
var_dump($_SERVER);
}
그렇다면 Android 측의 $_SERVER의 키 값만 얻을 수 있고 값을 얻을 수 없습니다.
( var_dump($_SERVER['DOCUMENT_ROOT']が取得できない
)
왠지 모르지만 먼저 var_dump () 는 android 측에서 값만 얻을 수 있습니다.
왜?
Controllerpublic function sample(Request $request){
var_dump("");
var_dump($_SERVER);
이렇게 하면value 값이 표시됩니다.
var_루트는 dump($_SERVER['DOCUMENT_ROOT'])에서 얻을 수 있습니다.
응
시간이 오래 걸렸어요.도착까지 3일.하지만 진일보.여느 때와 마찬가지로 거북이의 걸음걸이야!
$request = json_decode($request,true);
senddata.put("key1","value1");
senddata.put("key2","value2");
などとして
HttpURLConnectionで
connection.addRequestProperty("senddata",String.balueoOf(senddata);
Route::get('/sample',function(){setrawcookie("param","laravel");});
public class MyAsyncTask extends AsyncTask<Void, Void, Map<String,List<String>>> {
@Override
protected Map<String,List<String>> doInBackground(Void... aVoid) {
try {
HttpURLConnection connection = (HttpURLConnection) new URL("https://www...").openConnection();
connection.connect();
Map<String,List<String>> header = connection.getHeaderFields();
connection.disconnect();
} catch (Exception e) {}
return header;
}
@Override
protected void onPostExecute(Map<String,List<String>> m) {
super.onPostExecute(m);
String param = m.get("Set-Cookie").get(0);
Log.d("------>", param);
}
}
Controller
public function sample(Request $request){
var_dump($_SERVER);
}
그렇다면 Android 측의 $_SERVER의 키 값만 얻을 수 있고 값을 얻을 수 없습니다.(
var_dump($_SERVER['DOCUMENT_ROOT']が取得できない
)왠지 모르지만 먼저 var_dump () 는 android 측에서 값만 얻을 수 있습니다.
왜?
Controller
public function sample(Request $request){
var_dump("");
var_dump($_SERVER);
이렇게 하면value 값이 표시됩니다.var_루트는 dump($_SERVER['DOCUMENT_ROOT'])에서 얻을 수 있습니다.
응
시간이 오래 걸렸어요.도착까지 3일.하지만 진일보.여느 때와 마찬가지로 거북이의 걸음걸이야!
Reference
이 문제에 관하여(51세부터 시작된 프로그래밍 메모 안드로이드에서 라벨로의 HttpURLConnection 연결), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/old_cat/items/9c25eaaec6af95cc778f텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)