Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 改装中的基本授权_Java_Android_Retrofit_Retrofit2 - Fatal编程技术网

Java 改装中的基本授权

Java 改装中的基本授权,java,android,retrofit,retrofit2,Java,Android,Retrofit,Retrofit2,接口: @GET("burrowedbooks/") Call<JsonArray> getCategoryList(@Header("Authorization") String token); @GET(“burrowedbooks/”) 调用getCategoryList(@Header(“Authorization”)字符串令牌); 用法: private LibraryAPi service; Retrofit retrofit = new Retro

接口:

@GET("burrowedbooks/")
Call<JsonArray> getCategoryList(@Header("Authorization") String token);
@GET(“burrowedbooks/”)
调用getCategoryList(@Header(“Authorization”)字符串令牌);
用法:

    private LibraryAPi service;

    Retrofit retrofit = new Retrofit.Builder()
            //.client(client)
            .baseUrl(String.valueOf(R.string.base_url))
            .addConverterFactory(GsonConverterFactory.create())
            .build();

        service = retrofit.create(LibraryAPi.class);



// Extract token from Shared Preferences.
    SharedPreferences prefs = getActivity().getSharedPreferences(getString(R.string.login_data), MODE_PRIVATE);
    String token = "Bearer "+prefs.getString("token","");


    Call<JsonArray> categoryListResponseCall = service.getCategoryList(token);
    categoryListResponseCall.enqueue(new Callback<JsonArray>() {
        @Override
        public void onResponse(Call<JsonArray> call, Response<JsonArray> response) {
            int statusCode = response.code();

            Toast.makeText(getContext(), ""+statusCode, Toast.LENGTH_SHORT).show();

        }

        @Override
        public void onFailure(Call<JsonArray> call, Throwable t) {

        }
    });
私人图书馆API服务;
改装改装=新改装.Builder()
//.客户(客户)
.baseUrl(String.valueOf(R.String.base_url))
.addConverterFactory(GsonConverterFactory.create())
.build();
服务=改装.create(LibraryAPi.class);
//从共享首选项中提取令牌。
SharedReferences prefs=getActivity().getSharedReferences(getString(R.string.login\u data),MODE\u PRIVATE);
String token=“Bearer”+prefs.getString(“token”,”);
调用categoryListResponseCall=service.getCategoryList(令牌);
categoryListResponseCall.enqueue(新回调(){
@凌驾
公共void onResponse(调用、响应){
int statusCode=response.code();
Toast.makeText(getContext(),“”+statusCode,Toast.LENGTH_SHORT).show();
}
@凌驾
失败时公共无效(调用调用,可丢弃的t){
}
});

我正在尝试发送存储在共享首选项中的身份验证令牌。上面的代码不起作用。返回403禁止状态码。发送身份验证头的正确方法是什么?

您在
.baseUrl(String.valueOf(R.String.base\u url))

您应该使用
.baseUrl(getActivity().getString(R.string.base_url))

但是您的代码不会向服务器发送数据,并且会调用
onFailure


如果您正确获取了字符串,但仍然获得403,则可能需要使用postman验证后端实现。

此外,您还可以创建自定义拦截器,以便在新请求时自动添加标头

OkHttpClient.Builder httpClient = new OkHttpClient.Builder();  
httpClient.addInterceptor(new Interceptor() {  
    @Override
    public Response intercept(Interceptor.Chain chain) throws IOException {
        Request original = chain.request();

        Request request = original.newBuilder()
           .header("Authorization", token)
           .method(original.method(), original.body())
           .build();

        return chain.proceed(request);
    }
}

OkHttpClient client = httpClient.build();  
Retrofit retrofit = new Retrofit.Builder()  
    .baseUrl(API_BASE_URL)
    .addConverterFactory(GsonConverterFactory.create())
    .client(client)
    .build();

另外,检查令牌是否从
SharedReferences
收到良好。你读起来很奇怪。

你从邮递员那里试过吗?当您打印
response.raw()
时会打印什么?
response{protocol=http/1.0,code=403,message=problemed,url=https://06724330.ngrok.io/burrowedbooks/}
您的服务器配置有问题,需要修复。您可能不允许从本地主机外部进行访问。通过暂时禁用授权,从其他计算机或Android浏览器尝试。谢谢。解决了。我使用了错误的令牌密钥。令牌可能已过期