如何在改造中使用基本身份验证发送帖子请求?

时间:2018-05-24 12:40:46

标签: android header retrofit basic-authentication

在我的代码中,我想发送带有基本身份验证的帖子请求。

这是我的邮递员截图:

enter image description here

这是我的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

4 个答案:

答案 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从服务器获取响应。我用简单的文字详细地写了这整篇文章。