简体   繁体   English

来自 Android 客户端的 HTTP 请求

[英]HTTP Request From Android Client

I have a really basic spring boot application running on localhost and i'm trying to get some data from another app on android studio.我有一个在 localhost 上运行的非常基本的 Spring Boot 应用程序,我正在尝试从 android studio 上的另一个应用程序获取一些数据。 My endpoint looks like this: http://localhost:8080/company/ {id} and returns this:我的端点如下所示: http://localhost:8080/company/ {id} 并返回:

我的资料

In my android application, I have created a wrapper class:在我的 android 应用程序中,我创建了一个包装类:

package gr.games.panayiotis.myapplication;
import com.fasterxml.jackson.annotation.JsonProperty;

public class Company {

@JsonProperty("id")
private long id;
@JsonProperty("name")
private String name;


public long getId() {
    return id;
}

public void setId(long id) {
    this.id = id;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}
}

And inside main application i'm creating a new class called Task that extends AsyncTask to get the api:在主应用程序中,我创建了一个名为 Task 的新类,它扩展了 AsyncTask 以获取 api:

package gr.games.panayiotis.myapplication;

import android.os.AsyncTask;
import android.os.Bundle;

import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.android.material.snackbar.Snackbar;

import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;

import android.view.View;
import android.view.Menu;
import android.view.MenuItem;

import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.client.RestTemplate;

public class MainActivity extends AppCompatActivity {


public class Task extends AsyncTask<String, Void, ResponseEntity<Company>>{


    @Override
    protected ResponseEntity<Company> doInBackground(String... strings) {
        String url = strings[0];
        RestTemplate restTemplate = new RestTemplate();

        try{
            restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());


            HttpHeaders headers = new HttpHeaders();

            headers.add("Content-Type", "application/json");

            HttpEntity<String> entity = new HttpEntity<String>(headers);

            int id = 1;
            ResponseEntity<Company> responseEntity = restTemplate.exchange(url, HttpMethod.GET, entity, Company.class, id);

            System.out.println(responseEntity.getStatusCode());
            System.out.println(responseEntity.toString());

            return responseEntity;

        }catch (Exception e){
            //System.out.println("ERROR:\n");
            e.getMessage();
            //System.out.println("\nEND OF ERROR");
            return null;
        }
    }

    protected void onPostExecute(ResponseEntity<Company> response){
        //Company company = response.getBody();
       // System.out.println(company.getName());
    }
}


//A button invokes this method
public void getData(View view){
    String url = "http://localhost:8080/company/1";
    new Task().execute(url);
}



@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Toolbar toolbar = findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    FloatingActionButton fab = findViewById(R.id.fab);
    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                    .setAction("Action", null).show();
        }
    });
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    //noinspection SimplifiableIfStatement
    if (id == R.id.action_settings) {
        return true;
    }

    return super.onOptionsItemSelected(item);
}
}

Inside the doInBackground() method my code runs up to the point where i call restTemplate.exchange().在 doInBackground() 方法中,我的代码运行到我调用 restTemplate.exchange() 的地方。 After that it goes into the catch block and returns null to the response.之后它进入catch块并返回null给响应。

The first time i invoke my getData() method i get these warnings :第一次调用我的 getData() 方法时,我收到以下警告:

Capturing and displaying logcat messages from application. This behavior can be disabled in the 
"Logcat output" section of the "Debugger" settings page.
D/NetworkSecurityConfig: No Network Security Config specified, using platform default
W/Java7Handlers: Unable to load JDK7 types (java.nio.file.Path): no Java7 type support added

I get no error but i can't figure out why i'm not getting a response.我没有收到任何错误,但我不知道为什么我没有收到回复。 My Spring Boot application never gets a request.我的 Spring Boot 应用程序从未收到请求。 I just got into android so any help is much appreciated.我刚进入 android,所以非常感谢任何帮助。

Add this line in your AndroidManifest.xml ,android:allowClearUserData="true".. maybe it will solve your issue.在您的 AndroidManifest.xml 中添加这一行,android:allowClearUserData="true" .. 也许它会解决您的问题。

 <application
    android:allowBackup="true"
    android:allowClearUserData="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">

or refer my methods from below link..或从下面的链接中参考我的方法..

https://stackoverflow.com/questions/59464257/login-using-url-with-username-and-password-in-android-mobile-app/59466586#59466586

I found the error after some digging.经过一番挖掘,我发现了错误。

Turns out when you run your android application to an emulator the localhost address is this: http://10.0.2.2:8080 so all i had to do was change my url.事实证明,当您将 android 应用程序运行到模拟器时,本地主机地址是这样的: http://10.0.2.2:8080 : http://10.0.2.2:8080 : http://10.0.2.2:8080所以我所要做的就是更改我的 url。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM