1. 程式人生 > >如何通過Retrofit提交Json格式資料

如何通過Retrofit提交Json格式資料

本文將介紹如何通過retrofit庫post一串json格式的資料。首先post的json資料格式如下:

{
  "Id": "string",
  "DeviceId": "string",
  "Name": "string",
  "SumDistance": 0,
  "RouteNo": "string",
  "SumPoints": 0,
  "SetupTime": "2016-06-10T13:11:00.766Z",
  "UsedTime": 0,
  "Points": [
    {
      "Id": "string",
      "RouteNo": "string",
      "Name": "string",
      "Longitude": "string",
      "Latitude": "string",
      "Height": 0,
      "Distance": 0,
      "Yaw": 0,
      "Pitch": 0,
      "Speed": 0,
      "Usedtime": 0
    }
  ]
}

通過安裝android studio gsonformat外掛,根據上面的json格式自動生成一個Bean類,本文命名為FlyRouteBean,

package com.example.administrator.retrofitex;
import java.util.List;

import android.os.Parcel;
import android.os.Parcelable;

/**
 * Created by Administrator on 2016/6/10.
 */
public class FlyRouteBean{

    /**
     * Id : string
     * DeviceId : string
     * Name : string
     * SumDistance : 0
     * RouteNo : string
     * SumPoints : 0
     * SetupTime : 2016-05-23T06:20:50.254Z
     * UsedTime : 0
     * Points : [{"Id":"string","RouteNo":"string","Name":"string","Longitude":"string","Latitude":"string","Height":0,"Distance":0,"Yaw":0,"Pitch":0,"Speed":0,"Usedtime":0}]
     */

    public String Id;
    public String DeviceId;
    public String Name;
    public double SumDistance;
    public String RouteNo;
    public int SumPoints;
    public String SetupTime;
    public double UsedTime;
    /**
     * Id : string
     * RouteNo : string
     * Name : string
     * Longitude : string
     * Latitude : string
     * Height : 0
     * Distance : 0
     * Yaw : 0
     * Pitch : 0
     * Speed : 0
     * Usedtime : 0
     */

    public List<PointsBean> Points;

    public String getId() {
        return Id;
    }

    public void setId(String Id) {
        this.Id = Id;
    }

    public String getDeviceId() {
        return DeviceId;
    }

    public void setDeviceId(String DeviceId) {
        this.DeviceId = DeviceId;
    }

    public String getName() {
        return Name;
    }

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

    public double getSumDistance() {
        return SumDistance;
    }

    public void setSumDistance(double SumDistance) {
        this.SumDistance = SumDistance;
    }

    public String getRouteNo() {
        return RouteNo;
    }

    public void setRouteNo(String RouteNo) {
        this.RouteNo = RouteNo;
    }

    public int getSumPoints() {
        return SumPoints;
    }

    public void setSumPoints(int SumPoints) {
        this.SumPoints = SumPoints;
    }

    public String getSetupTime() {
        return SetupTime;
    }

    public void setSetupTime(String SetupTime) {
        this.SetupTime = SetupTime;
    }

    public double getUsedTime() {
        return UsedTime;
    }

    public void setUsedTime(double UsedTime) {
        this.UsedTime = UsedTime;
    }

    public List<PointsBean> getPoints() {
        return Points;
    }

    public void setPoints(List<PointsBean> Points) {
        this.Points = Points;
    }

    public static class PointsBean implements Parcelable {
        public String Id;
        public String RouteNo;
        public String Name;
        public String Longitude;
        public String Latitude;
        public double Height;
        public double Distance;
        public double Yaw;
        public double Pitch;
        public double Speed;
        public double Usedtime;

        public String getId() {
            return Id;
        }

        public void setId(String Id) {
            this.Id = Id;
        }

        public String getRouteNo() {
            return RouteNo;
        }

        public void setRouteNo(String RouteNo) {
            this.RouteNo = RouteNo;
        }

        public String getName() {
            return Name;
        }

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

        public String getLongitude() {
            return Longitude;
        }

        public void setLongitude(String Longitude) {
            this.Longitude = Longitude;
        }

        public String getLatitude() {
            return Latitude;
        }

        public void setLatitude(String Latitude) {
            this.Latitude = Latitude;
        }

        public double getHeight() {
            return Height;
        }

        public void setHeight(double Height) {
            this.Height = Height;
        }

        public double getDistance() {
            return Distance;
        }

        public void setDistance(double Distance) {
            this.Distance = Distance;
        }

        public double getYaw() {
            return Yaw;
        }

        public void setYaw(double Yaw) {
            this.Yaw = Yaw;
        }

        public double getPitch() {
            return Pitch;
        }

        public void setPitch(double Pitch) {
            this.Pitch = Pitch;
        }

        public double getSpeed() {
            return Speed;
        }

        public void setSpeed(double Speed) {
            this.Speed = Speed;
        }

        public double getUsedtime() {
            return Usedtime;
        }

        public void setUsedtime(double Usedtime) {
            this.Usedtime = Usedtime;
        }

        @Override
        public String toString() {
            return "PointsBean{" +
                    "Id='" + Id + '\'' +
                    ", RouteNo='" + RouteNo + '\'' +
                    ", Name='" + Name + '\'' +
                    ", Longitude='" + Longitude + '\'' +
                    ", Latitude='" + Latitude + '\'' +
                    ", Height=" + Height +
                    ", Distance=" + Distance +
                    ", Yaw=" + Yaw +
                    ", Pitch=" + Pitch +
                    ", Speed=" + Speed +
                    ", Usedtime=" + Usedtime +
                    '}';
        }

        @Override
    	public void writeToParcel(Parcel dest, int flags) {
    		// TODO Auto-generated method stub
    		dest.writeString(Id);
    		dest.writeString(RouteNo);
    		dest.writeString(Name);
    		dest.writeString(Longitude);
    		dest.writeString(Latitude);
    		dest.writeDouble(Height);		
    		dest.writeDouble(Distance);
    		dest.writeDouble(Yaw);
    		dest.writeDouble(Pitch);
    		dest.writeDouble(Speed);
    		dest.writeDouble(Usedtime);		
    	}
    	public static final Creator<PointsBean> CREATOR=new Creator<PointsBean>() {

    		@Override
    		public PointsBean createFromParcel(Parcel source) {
    			// TODO Auto-generated method stub
    			PointsBean pointsBean=new PointsBean();
    			pointsBean.setId(source.readString());
    			pointsBean.setRouteNo(source.readString());
    			pointsBean.setName(source.readString());
    			pointsBean.setLongitude(source.readString());
    			pointsBean.setLatitude(source.readString());
    			pointsBean.setHeight(source.readInt());
    			pointsBean.setDistance(source.readInt());
    			pointsBean.setYaw(source.readInt());
    			pointsBean.setPitch(source.readInt());
    			pointsBean.setSpeed(source.readInt());
    			pointsBean.setUsedtime(source.readInt());
    			return pointsBean;
    		}

    		@Override
    		public PointsBean[] newArray(int size) {
    			// TODO Auto-generated method stub
    			return new PointsBean[size];
    		}
    		
    	};

		@Override
		public int describeContents() {
			// TODO Auto-generated method stub
			return 0;
		}
    }

    @Override
    public String toString() {
        return "FlyRouteBean{" +
                "Id='" + Id + '\'' +
                ", DeviceId='" + DeviceId + '\'' +
                ", Name='" + Name + '\'' +
                ", SumDistance=" + SumDistance +
                ", RouteNo='" + RouteNo + '\'' +
                ", SumPoints=" + SumPoints +
                ", SetupTime='" + SetupTime + '\'' +
                ", UsedTime=" + UsedTime +
                ", Points=" + Points +
                '}';
    }

	
}

然後就來建立介面了,其內容如下:
public interface PostRoute {
   @Headers({"Content-Type: application/json","Accept: application/json"})//需要新增頭
    @POST("api/FlyRoute/Add")
   Call<FlyRouteBean> postFlyRoute(@Body RequestBody route);//傳入的引數為RequestBody
}
接下來就是提交資料的了:
        FlyRouteBean flyRouteBean=new FlyRouteBean();
        flyRouteBean=initdata(flyRouteBean);//根據Bean類初始化一個需要提交的資料類
        Gson gson=new Gson();
        String route= gson.toJson(flyRouteBean);//通過Gson將Bean轉化為Json字串形式  
        Retrofit retrofit=new Retrofit.Builder()
                .baseUrl(URL)
                .addConverterFactory( GsonConverterFactory.create())
                .build();
        PostRoute postRoute=retrofit.create(PostRoute.class);
        RequestBody body=RequestBody.create(okhttp3.MediaType.parse("application/json; charset=utf-8"),route);
        Call<FlyRouteBean> call=postRoute.postFlyRoute(body);
       call.enqueue(new Callback<FlyRouteBean>() {
        @Override
        public void onResponse(Call<FlyRouteBean> call, Response<FlyRouteBean> response) {
            Log.e("sssss","-----------------------"+response.body().getDeviceId());//這裡是用於測試,伺服器返回的資料就是提交的資料。
        }

        @Override
        public void onFailure(Call<FlyRouteBean> call, Throwable t) {
            Log.e("sssss",t.getMessage());
        }
    });

<----------------------- 更新如何同時提交json資料和其他查詢欄位:------------------------------>

伺服器端(ASP):核心程式碼如下,接收一個json格式學生類,加一個bool型別

[HttpPost]
    public IHttpActionResult Info(Student stu, bool IsGay)
        {
            
            return Ok(stu.Name);
        }

客戶端:

//介面地址:http://172.20.69.209:9665/api/Test/Info?IsGay={IsGay}
@POST("api/Test/Info")
Call<ResponseBody> postStudent(@Body RequestBody stu,@Query("IsGay") boolean IsGay);

實現程式碼:

Student stu=new Student();
stu.setId("20103177");
stu.setName("zpm");
stu.setAge(18);
Gson gson=new Gson();
String route= gson.toJson(stu);
Log.e("post", "//");
Retrofit retrofit=new Retrofit.Builder()
        .baseUrl("http://172.20.69.209:9665/")
        .addConverterFactory( GsonConverterFactory.create())
        .build();
PostRoute postRoute=retrofit.create(PostRoute.class);
RequestBody body=RequestBody.create(okhttp3.MediaType.parse("application/json; charset=utf-8"),route);
Call<ResponseBody> call=postRoute.postStudent(body,true);
call.enqueue(new Callback<ResponseBody>() {
    @Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
        try {
            Log.i("onResponse", response.body().string());
} catch (IOException e) {
            e.printStackTrace();
}
    }

    @Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
        Log.e("onFailure", t.getMessage());
}
});
Log.e("postjson", route);
結果:


具體程式碼已經傳到github

PS:本文中伺服器都是樓主在區域網搭建的,

需要新增的依賴:

compile 'com.squareup.retrofit2:retrofit:2.0.2'
    compile 'com.squareup.retrofit2:converter-gson:2.0.0-beta3'

原始碼下載