如何使用Android调用Web服务
我是Android应用程序开发的新手。我正在开发一个购物车应用程序。我正在尝试使用android调用GET方法中的web服务。但是我怎么能做到呢?我试过的就在这里。但是它给了我一个错误如何使用Android调用Web服务,android,rest,web-services,Android,Rest,Web Services,我是Android应用程序开发的新手。我正在开发一个购物车应用程序。我正在尝试使用android调用GET方法中的web服务。但是我怎么能做到呢?我试过的就在这里。但是它给了我一个错误PostResponseAsyncTask:405方法不允许。如何解决这个问题?有人能帮我吗?提前谢谢 主片段类 public类MainFragment扩展片段实现异步响应,AdapterView.OnItemClickListener{ 公共静态最终字符串PREFS=“prefFile”; 最终字符串LOG=“M
PostResponseAsyncTask:405方法不允许
。如何解决这个问题?有人能帮我吗?提前谢谢
主片段类
public类MainFragment扩展片段实现异步响应,AdapterView.OnItemClickListener{
公共静态最终字符串PREFS=“prefFile”;
最终字符串LOG=“MainFragment”;
最终静态字符串url=”http://10.0.3.2:8080/WebService/rest/get/products";
私有ArrayList产品列表;
私有ListView lv;
眼底适配器;
视图;
公共MainFragment(){
}
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
视图=充气机。充气(R.layout.fragment_main,容器,假);
ImageLoader.getInstance().init(UILConfig.config(MainFragment.this.getActivity());
PostResponseAsyncTask taskRead=新的PostResponseAsyncTask(MainFragment.this.getActivity(),this);
taskRead.execute(url);
返回视图;
}
@凌驾
公共void processFinish(字符串s){
productList=new JsonConverter().toArrayList(s,Products.class);
BindDictionary dic=新的BindDictionary();
dic.addStringField(R.id.tvName,新StringExtractor(){
@凌驾
公共字符串getStringValue(产品项,int位置){
返回item.name;
}
});
dic.addStringField(R.id.tvDesc,新StringExtractor(){
@凌驾
公共字符串getStringValue(产品项,int位置){
退货项目描述;
}
}).visibilityIfNull(View.GONE);
dic.addStringField(R.id.tvPrice,新StringExtractor(){
@凌驾
公共字符串getStringValue(产品项,int位置){
返回“”+项目价格;
}
});
dic.addDynamicImageField(R.id.ivImage,新StringExtractor(){
@凌驾
公共字符串getStringValue(产品项,int位置){
返回item.pic;
}
},新的DynamicImageLoader(){
@凌驾
public void loadImage(字符串url,ImageView img){
//设置图像
ImageLoader.getInstance().displayImage(url,img);
}
});
dic.addBaseField(R.id.btnCart).onClick(新项目ClickListener()){
});
adapter=newfundapter(MainFragment.this.getActivity(),productList,R.layout.product_行,dic);
lv=(ListView)view.findViewById(R.id.lvProduct);
低压设置适配器(适配器);
lv.setOnItemClickListener(本);
}
@凌驾
public void onItemClick(AdapterView父对象、视图、整型位置、长id){
}
}
您正在通过执行此PostResponseAsyncTask
来执行POST请求,这就是您获得405方法不允许的原因。如果该端点接受GET,则执行GET请求。最好使用截取或改型库进行网络通信。尝试使用改型、截取、Loopj等库进行异步GET或POST HTTP请求
要从url或文件路径实现动态图像,请使用Piccasso或Glide库
下面是一些关于这些库的示例和文档
洛普
改造
截击
动态图像处理
毕加索
滑翔
希望这些能帮助你
改装示例
build.gradle(应用程序)
主要片段
ApiInterface
基金捕捉器
class FunDapter扩展了ArrayAdapter{
私人语境;
私有ArrayList对象;
专用静态充气机=空;
public FunDapter(@NonNull上下文,int资源,@NonNull数组列表对象){
超级(上下文、资源、对象);
试一试{
this.context=上下文;
this.objects=对象;
充气器=(LayoutFlater)context.getSystemService(context.LAYOUT\u充气器\u服务);
}捕获(例外e){
}
}
public int getCount(){
返回objects.size();
}
公共产品getItem(产品位置){
返回位置;
}
公共长getItemId(int位置){
返回位置;
}
公共静态类视图持有者{
公共文本视图显示名称;
公共文本视图显示单元编号;
公众形象;
}
公共视图getView(int位置、视图转换视图、视图组父视图){
视图vi=转换视图;
最终持票人;
试一试{
if(convertView==null){
vi=充气机充气(R.layout.singlerow_mylistview,空);
holder=新的ViewHolder();
holder.display_name=(TextView)vi.findViewById(R.id.title_listview);
holder.display_number=(TextView)vi.findViewById(R.id.subtitle_listview);
holder.image=(ImageView)vi.findViewById(R.id.icon\u listview);
vi.setTag(支架);
}否则{
holder=(ViewHolder)vi.getTag();
}
holder.display_name.setText(objects.get(position.getName());
holder.display_number.setText(objects.get(position.getPrice());
毕加索。与(上下文)
.load(objects.get(position.getPic())
.调整大小(50,50)
.centerCrop()
.插入(支架图像);
}捕获(例外e){
}
返回vi;
}
}
别忘了在M中添加
public class MainFragment extends Fragment implements AsyncResponse, AdapterView.OnItemClickListener{
public static final String PREFS = "prefFile";
final String LOG = "MainFragment";
final static String url = "http://10.0.3.2:8080/WebService/rest/get/products";
private ArrayList<Products> productList;
private ListView lv;
FunDapter<Products> adapter;
View view;
public MainFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
view = inflater.inflate(R.layout.fragment_main, container, false);
ImageLoader.getInstance().init(UILConfig.config(MainFragment.this.getActivity()));
PostResponseAsyncTask taskRead = new PostResponseAsyncTask(MainFragment.this.getActivity(), this);
taskRead.execute(url);
return view;
}
@Override
public void processFinish(String s) {
productList = new JsonConverter<Products>().toArrayList(s, Products.class);
BindDictionary dic = new BindDictionary();
dic.addStringField(R.id.tvName, new StringExtractor<Products>() {
@Override
public String getStringValue(Products item, int position) {
return item.name;
}
});
dic.addStringField(R.id.tvDesc, new StringExtractor<Products>() {
@Override
public String getStringValue(Products item, int position) {
return item.description;
}
}).visibilityIfNull(View.GONE);
dic.addStringField(R.id.tvPrice, new StringExtractor<Products>() {
@Override
public String getStringValue(Products item, int position) {
return ""+item.price;
}
});
dic.addDynamicImageField(R.id.ivImage, new StringExtractor<Products>() {
@Override
public String getStringValue(Products item, int position) {
return item.pic;
}
}, new DynamicImageLoader() {
@Override
public void loadImage(String url, ImageView img) {
//Set image
ImageLoader.getInstance().displayImage(url, img);
}
});
dic.addBaseField(R.id.btnCart).onClick(new ItemClickListener() {
});
adapter = new FunDapter<>(MainFragment.this.getActivity(), productList, R.layout.product_row, dic);
lv = (ListView)view.findViewById(R.id.lvProduct);
lv.setAdapter(adapter);
lv.setOnItemClickListener(this);
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
}
}
implementation 'com.google.code.gson:gson:2.6.2'
implementation 'com.squareup.retrofit2:retrofit:2.0.2'
implementation 'com.squareup.retrofit2:converter-gson:2.0.2'
public class MainFragment extends Fragment {
public static final String PREFS = "prefFile";
final String LOG = "MainFragment";
private ArrayList<Product> productList;
private ListView lv;
FunDapter adapter;
private ApiInterface apiInterface;
View view;
public MainFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_main, container, false);
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
lv = (ListView) view.findViewById(R.id.lvProduct);
apiInterface = ApiClient.getRetrofitApiClient().create(ApiInterface.class);
productList = new ArrayList<Product>();
adapter= new FunDapter (getContext(), 0, productList);
lv.setAdapter(adapter);
getProduct();
}
private void getProduct() {
Call<List<Product>> call = apiInterface.getProducts();
call.enqueue(new Callback<List<Product>>() {
@Override
public void onResponse(Call<List<Product>> call, Response<List<Product>> response) {
List<Product> products= response.body();
Log.d("TEST", "onResponse: "+response.body().size());
if(products.size()>0){
productList.addAll(products);
}
adapter.notifyDataSetChanged();
}
@Override
public void onFailure(Call<List<Product>> call, Throwable t) {
}
});
}
}
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
/**
* Created by android on 3/10/17.
*/
class ApiClient {
public static final String BASE_URL = "http://10.0.2.2:8080/WebService/rest/";
public static Retrofit retrofit = null;
public static Retrofit getRetrofitApiClient() {
if (retrofit == null) {
retrofit = new Retrofit.Builder().baseUrl(BASE_URL).addConverterFactory(GsonConverterFactory.create()).build();
}
return retrofit;
}
}
import java.util.List;
import retrofit2.Call;
import retrofit2.http.Body;
import retrofit2.http.GET;
import retrofit2.http.POST;
import retrofit2.http.Query;
public interface ApiInterface {
@GET("get/products")
Call<List<Product>> getProducts();
}
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;
class Product {
@SerializedName("name")
@Expose
private String name;
@SerializedName("ram")
@Expose
private String ram;
@SerializedName("price")
@Expose
private String price;
@SerializedName("pic")
@Expose
private String pic;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getRam() {
return ram;
}
public void setRam(String ram) {
this.ram = ram;
}
public String getPrice() {
return price;
}
public void setPrice(String price) {
this.price = price;
}
public String getPic() {
return pic;
}
public void setPic(String pic) {
this.pic = pic;
}
}
class FunDapter extends ArrayAdapter<Product> {
private Context context;
private ArrayList<Product> objects;
private static LayoutInflater inflater = null;
public FunDapter(@NonNull Context context, int resource, @NonNull ArrayList<Product> objects) {
super(context, resource, objects);
try {
this.context = context;
this.objects = objects;
inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
} catch (Exception e) {
}
}
public int getCount() {
return objects.size();
}
public Product getItem(Product position) {
return position;
}
public long getItemId(int position) {
return position;
}
public static class ViewHolder {
public TextView display_name;
public TextView display_number;
public ImageView image;
}
public View getView(int position, View convertView, ViewGroup parent) {
View vi = convertView;
final ViewHolder holder;
try {
if (convertView == null) {
vi = inflater.inflate(R.layout.singlerow_mylistview, null);
holder = new ViewHolder();
holder.display_name = (TextView) vi.findViewById(R.id.title_listview);
holder.display_number = (TextView) vi.findViewById(R.id.subtitle_listview);
holder.image = (ImageView) vi.findViewById(R.id.icon_listview);
vi.setTag(holder);
} else {
holder = (ViewHolder) vi.getTag();
}
holder.display_name.setText(objects.get(position).getName());
holder.display_number.setText(objects.get(position).getPrice());
Picasso.with(context)
.load(objects.get(position).getPic())
.resize(50, 50)
.centerCrop()
.into(holder.image);
} catch (Exception e) {
}
return vi;
}
}
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://10.0.3.2:8080/WebService/")
.addConverterFactory(GsonConverterFactory.create())
.build();
SampleInterface request = retrofit.create(SampleInterface.class);
Call<YourObjectModel> call1=request.getResponse();
call1.enqueue(new Callback<YourObjectModel>() {
@Override
public void onResponse(Call<YourObjectModel> call, Response<YourObjectModel> response) {
Toast.makeText(MainActivity.this,response.body().toString(),Toast.LENGTH_SHORT).show();
}
@Override
public void onFailure(Call<YourObjectModel> call, Throwable t) {
Toast.makeText(MainActivity.this,t.toString(),Toast.LENGTH_SHORT).show();
}
});
public interface SampleInterface {
@GET("rest/get/products")
Call<YourObjectModel> getResponse();
}