在我的代码中,我想发送带有基本身份验证的帖子请求。
这是我的邮递员截图:
这是我的apiInterface类
@FormUrlEncoded
@POST("GetBarcodeDetail")
Call<PreliminaryGoodsAcceptResponse> PRELIMINARY_GOODS_ACCEPT_RESPONSE_CALL(@Field("ProcName") String procName, @Field("Barcode") String barcode, @Field("LangCode") String langCode);
这是我的apiclient
public class ApiClient {
public static final String BASE_URL = "http://192.**********";
private static Retrofit retrofit = null;
private static OkHttpClient sClient;
public static Retrofit getClient() {
if(sClient == null) {
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
sClient = new OkHttpClient.Builder()
.addInterceptor(new HttpLoggingInterceptor(HttpLoggingInterceptor.Logger.DEFAULT))
.addInterceptor(interceptor)
.build();
}
if (retrofit==null) {
retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.client(sClient)
.build();
}
return retrofit;
}
}
我的问题是如何使用标题发送帖子请求:
标题用户名:EBA令牌:
34242353453456563DSFS
答案 0 :(得分:2)
这是迄今为止我尝试过的最简单的“基本身份验证”方法。
使用以下代码生成auth标头(API /存储库类)
var basic = Credentials.basic("YOUR_USERNAME", "YOUR_PASSWORD")
将此作为标头传递到Web服务调用(API /存储库类)
var retrofitCall = myWebservice.getNewsFeed(basic)
添加基本标头作为参数(Retrofit Web服务接口类)
@GET("newsfeed/daily")
fun getNewsFeed(@Header("Authorization") h1:String):Call<NewsFeedResponse>
对不起,我的代码在Kotlin中,但是可以轻松地翻译成Java。
参考:https://mobikul.com/basic-authentication-retrofit-android/
答案 1 :(得分:1)
用户标题注释
@FormUrlEncoded
@POST("GetBarcodeDetail")
Call<PreliminaryGoodsAcceptResponse> PRELIMINARY_GOODS_ACCEPT_RESPONSE_CALL(@Header("Authorization") token: String,@Field("ProcName") String procName, @Field("Barcode") String barcode, @Field("LangCode") String langCode);
答案 2 :(得分:1)
像这样制作标题..
private Retrofit getClient(final Context context) {
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient.Builder client = new OkHttpClient.Builder();
client.readTimeout(60, TimeUnit.SECONDS);
client.writeTimeout(60, TimeUnit.SECONDS);
client.connectTimeout(60, TimeUnit.SECONDS);
client.addInterceptor(interceptor);
client.addInterceptor(new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
if (context == null) {
request = request
.newBuilder()
.build();
} else {
request = request
.newBuilder()
.addHeader("Authorization", "Bearer " + AppSetting.getStringSharedPref(context, Constants.USER_KEY_TOKEN, ""))
.build();
}
return chain.proceed(request);
}
});
retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.client(client.build())
.addConverterFactory(GsonConverterFactory.create())
.build();
return retrofit;
}
答案 3 :(得分:0)
Simple-Retrofit-API-request-and-Data-Loading在这里,我只需添加创建API调用的项目,即可使用改造库从数据库访问数据;这是领先的图书馆访问网络上的数据。并以列表格式显示访问的数据。使用空活动创建简单的Android Studio项目。创建适配器和活动项以在Android应用程序中显示正常列表。现在创建扩展Application的App类,因为Application类是一个单例,您可以从任何活动或任何其他具有Context对象的地方访问它。 您可以从https://github.com/codepath/android_guides/wiki/Understanding-the-Android-Application-Class Why extend an Application class? https://developer.android.com/reference/android/app/Application.html
查看有关应用类的详细信息添加android:name =“。YourApplication”,即在android中扩展Application类的类名。和类将像公共类一样YourApplication将Application Init扩展为Application类中的Retrofit
//network code start
//init http logger
httpLoggingInterceptor = new HttpLoggingInterceptor();
httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
// init client client = new OkHttpClient.Builder()
.addInterceptor(httpLoggingInterceptor)
.addInterceptor(new Interceptor() {
@Override public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
Request request2 = request.newBuilder().build();
return chain.proceed(request2);
}
}).connectTimeout(30, TimeUnit.SECONDS).writeTimeout(30, TimeUnit.SECONDS).readTimeout(30, TimeUnit.SECONDS).build();
Gson gson = new GsonBuilder().setLenient().create();
Retrofit mRetrofit = new Retrofit.Builder().baseUrl(Constants.API_BASE_URL).client(client).addConverterFactory(GsonConverterFactory.create(gson)).build();
mWebservice = mRetrofit.create(Webservice.class);
虽然Constants.API_BASE_URL是基本网址创建Webervice.class,您可以使用参数调用API,例如在GET方法的情况下:
@GET("webservices/GetAllClientsDemoRetro.php")
Call updateChatStatus();
如果是POST方法:
@FormUrlEncoded
@Headers({"Content-Type: application/x-www-form-urlencoded"})
@POST("webservices/GetAllClientsDemoRetro.php")
调用updateChatStatus();
您可以在此处查看有关官方API声明的更改的详细信息:http://square.github.io/retrofit/
我们可以使用Parceble类用POJO解析值,即Setter和Getter。由于解析密钥名称应该等于我们从JSON响应中接收的值。 POJO类应声明为公共类ClientData实现Parcelable {然后声明类中的键,键值表示
public class ClientData implements Parcelable
{
public String client_id;
public String company_name;
public String address_line;
public String city;
public String pincode;
public String state;
public String country;
}
现在使用Alt + Enter,即选择Add Parceble Implementation选项并按Enter键。然后会自动添加parceble类。您还必须使用Alt + Insert在类中添加Setter和Getter方法。注意:不要为CREATER添加Setter和Getter方法:Creater&lt;&gt;方法如果要使用JSON响应键的不同键,则应使用序列化。当我使用相同的密钥时,它就像公共String client_id;但是当我使用序列化时,我可以像@Serializattion(“client_id”)一样使用public String ClientID;现在最后但不是列表,我们使用改进调用API,并使用响应来查看列表中的项目 -
RetroFitApplication.getWebservice().updateChatStatus().enqueue(new Callback() {
@Override public void onResponse(Call call, Response response) {
Log.d("retrofilt success", "" + response.body());
if (response.body() != null) {
clientResponceData = response.body();
Gson gson = new Gson();
String body = gson.toJson(response.body());
Log.d("retrofilt success2", "clientData" + clientResponceData.getResponse());
if (clientResponceData.getResponse() != null) {
initRV();
}
} else {
// Empty Client List Toast.makeText(ClientList.this, "Empty List", Toast.LENGTH_SHORT).show();
}
}
@Override public void onFailure(Call call, Throwable t) {
Log.d("retrofilt error", "" + t);
Toast.makeText(ClientList.this, "No Internet Connection", Toast.LENGTH_SHORT).show();
}
});
通过使用Construction in Adapter,我们可以使用响应中的值。伙计们我添加了这个存储库以获得调用API的整个想法,并使用Retrofit Library从服务器获取响应。我用简单的文字详细地写了这整篇文章。