Friends, help, I have not been able to set up a full-fledged API all day HttpURLConnection
through HttpURLConnection
and java.net.URL
The problem is that you can't convert an InputStream
to a string. There is no Exception in the console, I get an empty string at the output. In the nginx log, this request is also displayed normally.
My code is:
Manifesto:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.gobonus.gobonus"> <!-- To auto-complete the email text field in the login form with the user's emails --> <uses-permission android:name="android.permission.GET_ACCOUNTS" /> <uses-permission android:name="android.permission.READ_PROFILE" /> <uses-permission android:name="android.permission.READ_CONTACTS" /> <uses-permission android:name="android.permission.INTERNET" /> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/GB"> <activity android:name=".WelcomeActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".LoginActivity" android:label="@string/title_activity_login" android:parentActivityName=".WelcomeActivity"> <meta-data android:name="android.support.PARENT_ACTIVITY" android:value="com.gobonus.gobonus.WelcomeActivity" /> </activity> </application> </manifest>
WelcomeActivity
package com.gobonus.gobonus; import android.content.Intent; import android.os.AsyncTask; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.TextView; public class WelcomeActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_welcome); new AsyncRequest().execute("123", "/ajax/loginHandler.php", "foo=bar"); } public void LoginGo(View view) { Intent intent = new Intent(WelcomeActivity.this, LoginActivity.class); startActivity(intent); } class AsyncRequest extends AsyncTask<String, String, String> { private Request req; @Override protected String doInBackground(String... arg) { Request req = new Request(arg[0], arg[1], arg[2]); this.req = req; return req.Content; } @Override protected void onPostExecute(String s) { Log.d("Current Headers", String.valueOf(this.req.Headers)); Log.d("Current Content", this.req.Content); TextView WebTest = (TextView) findViewById(R.id.webTest); WebTest.setText(s); super.onPostExecute(s); } } }
Layout
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.gobonus.gobonus.WelcomeActivity"> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/sign" android:id="@+id/button" android:background="#B6B6B6" android:layout_marginBottom="162dp" android:onClick="LoginGo" android:layout_alignParentBottom="true" android:layout_alignRight="@+id/button2" android:layout_alignEnd="@+id/button2" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/reg" android:id="@+id/button2" android:background="#B6B6B6" android:layout_alignTop="@+id/button" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:layout_marginTop="82dp" android:layout_alignParentRight="true" android:layout_alignParentEnd="true" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="New Text" android:id="@+id/webTest" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:layout_marginTop="56dp" /> </RelativeLayout>
Request
package com.gobonus.gobonus; import android.util.Log; import java.io.DataOutputStream; import java.io.IOException; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.ProtocolException; import java.net.URL; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.util.List; import java.util.Map; public class Request { private final String USER_AGENT = "GoBonus Android Client 1.0"; private final String API_SERVER = "project.localhost"; private final Integer API_PORT = 80; private final String API_PROTOCOL = "http"; protected Map<String, List<String>> Headers; public String Content; public Request (String session_token, String uri, String params) { String urlParameters = "session_token="+session_token+"&"+params; // url params byte[] postData = new byte[0]; System.setProperty("http.agent", USER_AGENT); // user agent // api < 19 if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) { postData = urlParameters.getBytes( StandardCharsets.UTF_8 ); } else postData = urlParameters.getBytes(Charset.forName("UTF-8")); int postDataLength = postData.length; URL url = null; try { url = new URL( API_PROTOCOL, API_SERVER, API_PORT, uri); } catch (MalformedURLException e) { e.printStackTrace(); } HttpURLConnection conn= null; try { conn = (HttpURLConnection) url.openConnection(); } catch (IOException e) { e.printStackTrace(); } conn.setDoOutput( true ); conn.setInstanceFollowRedirects(false); try { conn.setRequestMethod("POST"); } catch (ProtocolException e) { e.printStackTrace(); } conn.setRequestProperty( "Content-Type", "application/x-www-form-urlencoded"); conn.setRequestProperty( "charset", "utf-8"); conn.setRequestProperty("Content-Length", Integer.toString(postDataLength)); conn.setUseCaches( false ); try { Log.d("request uri", url.toString()); DataOutputStream wr = new DataOutputStream( conn.getOutputStream()); wr.write(postData); conn.connect(); // after connect Content = ConvertData(conn); Headers = conn.getHeaderFields(); } catch (IOException e) { e.printStackTrace(); } } protected String ConvertData (HttpURLConnection c) throws IOException { return this.convertStreamToString(c.getInputStream()); } static String convertStreamToString(java.io.InputStream is) { java.util.Scanner s = new java.util.Scanner(is).useDelimiter("\\A"); return s.hasNext() ? s.next() : ""; } }
Logcat
03-24 20:29:44.904 8306-8306/? I/art: Late-enabling -Xcheck:jni 03-24 20:29:45.092 8306-8327/? D/OpenGLRenderer: Use EGL_SWAP_BEHAVIOR_PRESERVED: true 03-24 20:29:45.095 8306-8306/? W/linker: gralloc.clovertrail.so: unused DT entry: type 0xf arg 0x62a 03-24 20:29:45.095 8306-8306/? W/linker: libpvr2d.so: unused DT entry: type 0xf arg 0x79b 03-24 20:29:45.095 8306-8306/? W/linker: libpvr2d.so has text relocations. This is wasting memory and prevents security hardening. Please fix. 03-24 20:29:45.096 8306-8306/? W/linker: gralloc.clovertrail.so has text relocations. This is wasting memory and prevents security hardening. Please fix. 03-24 20:29:45.097 8306-8306/? E/IMGSRV: :0: PVRDRMOpen: TP3, ret = 27 03-24 20:29:45.097 8306-8306/? E/IMGSRV: :0: PVRDRMOpen: TP3, ret = 28 03-24 20:29:45.097 8306-8306/? E/IMGSRV: :0: PVRDRMOpen: TP3, ret = 28 03-24 20:29:45.097 8306-8306/? E/IMGSRV: :0: PVRDRMOpen: TP3, ret = 28 03-24 20:29:45.108 8306-8326/? D/request uri: http://project.localhost:80/ajax/loginHandler.php 03-24 20:29:45.113 8306-8306/? D/Atlas: Validating map... 03-24 20:29:45.171 8306-8327/? E/IMGSRV: :0: PVRDRMOpen: TP3, ret = 31 03-24 20:29:45.176 8306-8327/? E/IMGSRV: :0: PVRDRMOpen: TP3, ret = 33 03-24 20:29:45.177 8306-8327/? I/OpenGLRenderer: Initialized EGL, version 1.4 03-24 20:29:45.177 8306-8327/? W/OpenGLRenderer: Failed to choose config with EGL_SWAP_BEHAVIOR_PRESERVED, retrying without... 03-24 20:29:45.177 8306-8327/? W/linker: libPVROCL.so: unused DT entry: type 0xf arg 0x9fd 03-24 20:29:45.178 8306-8327/? W/linker: libPVROCL.so has text relocations. This is wasting memory and prevents security hardening. Please fix. 03-24 20:29:45.189 8306-8327/? D/OpenGLRenderer: Enabling debug mode 0 03-24 20:29:45.278 8306-8321/com.gobonus.gobonus I/art: Background partial concurrent mark sweep GC freed 1930(121KB) AllocSpace objects, 0(0B) LOS objects, 39% free, 2MB/4MB, paused 10.371ms total 50.765ms 03-24 20:29:45.298 8306-8306/com.gobonus.gobonus I/Timeline: Timeline: Activity_idle id: android.os.BinderProxy@233c3300 time:10120064 03-24 20:29:45.663 8306-8306/com.gobonus.gobonus D/Current Headers: {null=[HTTP/1.1 200 OK], Cache-Control=[no-store, no-cache, must-revalidate, post-check=0, pre-check=0], Connection=[keep-alive], Content-Type=[text/html; charset=UTF-8], Date=[Thu, 24 Mar 2016 17:29:46 GMT], Expires=[Thu, 19 Nov 1981 08:52:00 GMT], Pragma=[no-cache], Server=[nginx/1.8.0], Set-Cookie=[PHPSESSID=c8lhojjp7na4jib3ka326vl506; path=/], Transfer-Encoding=[chunked], X-Android-Received-Millis=[1458840585661], X-Android-Response-Source=[NETWORK 200], X-Android-Sent-Millis=[1458840585371], X-Content-Type-Options=[nosniff], X-XSS-Protection=[1; mode=block]}
I spend tests on API 22, what could be the problem? Please do not kick much, I started writing java only today