Google App Engine with Android - testing endpoints

2020-02-10 07:06发布

i've been following the tutorial in Creating an Endpoints Backend from an Android Project. Everything is compiling and looks promising. The backend is up, i changed CloudEndpointUtils#LOCAL_ANDROID_RUN to 'true'. but when i try to test the app on a real device (not emulator) im failing on -

java.net.SocketException: failed to connect to /10.0.2.2 (port 8888) after 20000ms: isConnected failed: EHOSTUNREACH (No route to host)

So i looked at CloudEndpointUtils and saw that setting LOCAL_ANDROID_RUN to 'true' makes the app look for DevAppServer in http://10.0.2.2:8888, which is the emulator virtual router. but im not using the emulator. so i tried to change the constant holding this url to http://127.0.0.1:8888/ but still no luck. im now failing on -

java.net.ConnectException: failed to connect to /127.0.0.1 (port 8888) after 20000ms: isConnected failed: ECONNREFUSED (Connection refused)

I thought it might be because my PC is behind a firewall, so i disabled it, but still nothing.

any suggestion would be appreciated.

7条回答
乱世女痞
2楼-- · 2020-02-10 07:48

There are many answers here but I've found them messy or uncomplete. To run the local server on your computer and test it with a real device do this:

1) Add httpAddress = "0.0.0.0" to the appengine block in your build.gradle file of the backend (Google Cloud Endpoint) module, like this:

appengine {
    ...
    httpAddress = "0.0.0.0"
}

According to a comment on the question this means that 'will accept from anywhere'.

2) Run your backend module locally (ie. start the web server). This is trivial: select the backend configuration on the drop-down menu and press the green button. You can find more detailed instructions here.

You should now be able to open a browser (on your computer) and navigate to http://localhost:8080/ and see a webpage with 'Hello, Endpoints!' and many other stuff.

3) Find your computer's IP address (on a Mac go to System Preferences -> Network) and then set it as the root url in your Android app code, like this:

MyApi.Builder builder = new MyApi.Builder(
                            AndroidHttp.newCompatibleTransport(),
                            new AndroidJsonFactory(), 
                            null
).setRootUrl("http://192.168.1.36:8080/_ah/api/")

That's all!

查看更多
Animai°情兽
3楼-- · 2020-02-10 07:49

Add the

--address="0.0.0.0" 

as the app engine server address parameter to accept from all incoming connections.

查看更多
Rolldiameter
4楼-- · 2020-02-10 07:53

If you want to do this in Android Studio, set httpAddress as follows in your build.gradle

appengine {

  ...

  httpAddress = "0.0.0.0"
}
查看更多
可以哭但决不认输i
5楼-- · 2020-02-10 07:59

When locally testing Google cloud endpoints from none localhost address --address="0.0.0.0" setting might not be sufficient.

My Endpoints were giving 404 Not Found error when accessing from non localhost. I resolved it by including path parameter in API decoration.

My API annotation looked like this:

@ApiMethod(name="saveResponse", httpMethod = "post", path="saveResponse)
public Response saveResponse(@Named("answerString") String responseString)
查看更多
做个烂人
6楼-- · 2020-02-10 07:59

Address 10.0.2.2 is for accessing localhost using the emulator, to access localhost using a real device, use the following steps

-open your commandline (cmd) run ipconfig. -Get the ipaddress of your computer and replace 10.0.2.2 with it, -Build and run on your device.

Hope this helps someone

查看更多
爷的心禁止访问
7楼-- · 2020-02-10 08:04

Follow the 2. point post by user248187 2.(Contniued) Go to Arugments -> add exactly like this --address=0.0.0.0 --port=.......

Now, On the client android code you need change the request IP (RootURL) of your services to local IP. You can do that by use builder.setRootUrl(). It is good that you add a flat for outomatice it on you android client, then it can switch between local and deployed app-engiene quickly. Such as:

//........................

private boolean mFlatLocalHostServer=true;  
private static final String LOCAL_IP = "192.168.1.11"; //Ip debug server
public static final String  LOCAL_SERVER_IP = "http://"+LOCAL_IP+":8888/_ah/api";
//......................
Mydataendpoint.Builder builder = new Mydataendpoint.Builder(
                                AndroidHttp.newCompatibleTransport(),
                                new GsonFactory(),
                                        mCredential); 

//request the  service to local ip 
if(mFlatLocalHostServer){
         builder.setRootUrl(LOCAL_SERVER_IP); 
}

Mydataendpoint service =  builder.build();
response=service.insertMyData(mydata).execute(); 
查看更多
登录 后发表回答