51세부터 시작된 프로그래밍 메모 안드로이드에서 라벨로의 HttpURLConnection 연결

android를 사용하여 로컬 Laravel 파일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 연결이 아니면 잘못된 규격입니다.
,192.168.xxx.xxx에 대해cleartextTrafficPermitted는 진실이고 AndroidManifest입니다.xml에 네트워크 보안 Config를 설정하세요!

■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 설정


을(를) 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
MyAsyncTask
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);
    }
}

Laravel에서 VarDump Header는 Android가 올바르게 취득할 수 없습니다.


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일.하지만 진일보.여느 때와 마찬가지로 거북이의 걸음걸이야!

좋은 웹페이지 즐겨찾기