简体   繁体   English

标头未在Android-Retrofit中正确设置

[英]Header not getting set properly in android-Retrofit

I'm building an app for sending access-token to the server using Retrofit in android. 我正在构建一个使用android中的Retrofit将访问令牌发送到服务器的应用程序。 I don't get any error what I think should set the header correctly is not working so. 我没有出现任何错误,我认为应该正确设置标头无法正常工作。

The header that I want: 我想要的标题:

"Authorization: Bearer facebook <user_access_token>"

is the token that I get. 是我得到的象征。 Not written here for security purposes. 出于安全考虑,此处未写。

I am using android Retrofit for the purpose with the files as follows: 我正在使用android Retrofit为此目的的文件,如下所示:

MainActivity.java MainActivity.java

package com.example.apurva.myapplication;

import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.os.StrictMode;




public class MainActivity extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
        StrictMode.setThreadPolicy(policy);

        UserService userService;
        String token = "Bearer facebook <user_access_token>";
        userService = ServiceGenerator.createService(UserService.class, UserService.BASE_URL, token);
        User user = userService.me();

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}

UserService.java UserService.java

package com.example.apurva.myapplication;

import com.squareup.okhttp.OkHttpClient;

import retrofit.Callback;
import retrofit.RequestInterceptor;
import retrofit.RestAdapter;
import retrofit.client.OkClient;
import retrofit.http.POST;

/**
 * Created by apurva on 4/8/15.
 */
public interface UserService {

        public static final String BASE_URL = "http://10.0.2.2:8000/auth";

        @POST("/convert-token")
        User me();

}

ServiceGenerator.java ServiceGenerator.java

package com.example.apurva.myapplication;

import com.squareup.okhttp.OkHttpClient;
import retrofit.RequestInterceptor;
import retrofit.RestAdapter;
import retrofit.client.OkClient;

/**
 * Created by apurva on 4/8/15.
 */
public class ServiceGenerator {
    private ServiceGenerator() {
    }

    public static <S> S createService(Class<S> serviceClass, String baseUrl, final String token) {
        RestAdapter.Builder builder = new RestAdapter.Builder()
                .setEndpoint(baseUrl)
                .setClient(new OkClient(new OkHttpClient()));

        if (token != null) {
            builder.setRequestInterceptor(new RequestInterceptor() {
                @Override
                public void intercept(RequestFacade request) {
                    request.addHeader("Accept", "application/json");
                    request.addHeader("Authorization", token);
                }
            });
        }

        RestAdapter adapter = builder.build();
        return adapter.create(serviceClass);
    }
}

I would like to mention that there are no errors. 我想提到没有错误。 I have already set network activity in the main thread by using StrictMode so that is not an issue as well just it does not give the desired result as the user in not getting added in the backend. 我已经通过使用StrictMode在主线程中设置了网络活动,所以这也不是问题,只是由于用户没有在后端添加,它不能提供所需的结果。

I would also like to tel you that I've already checked my back end with cURL and it works fine so there is no issue there as well. 我也想打电话给我,我已经用cURL检查了我的后端,它工作正常,所以那里也没有问题。

I get runtime error: 我收到运行时错误:

 Process: com.example.apurva.myapplication, PID: 7140 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.apurva.myapplication/com.example.apurva.myapplication.MainActivity}: retrofit.RetrofitError: 405 METHOD NOT ALLOWED at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2184) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2233) at android.app.ActivityThread.access$800(ActivityThread.java:135) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:136) at android.app.ActivityThread.main(ActivityThread.java:5001) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:515) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601) at dalvik.system.NativeStart.main(Native Method) Caused by: retrofit.RetrofitError: 405 METHOD NOT ALLOWED at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:388) at retrofit.RestAdapter$RestHandler.invoke(RestAdapter.java:240) at $Proxy0.me(Native Method) at com.example.apurva.myapplication.MainActivity.onCreate(MainActivity.java:24) at android.app.Activity.performCreate(Activity.java:5231) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2148)            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2233)            at android.app.ActivityThread.access$800(ActivityThread.java:135)            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)            at android.os.Handler.dispatchMessage(Handler.java:102)            at android.os.Looper.loop(Looper.java:136)            at android.app.ActivityThread.main(ActivityThread.java:5001)            at java.lang.reflect.Method.invokeNative(Native Method)            at java.lang.reflect.Method.invoke(Method.java:515)            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)            at dalvik.system.NativeStart.main(Native Method) 

Your code is ok. 您的代码还可以。 You should add logging to your Retrofit. 您应该将日志记录添加到改造中。

// Simple add .setLogLevel(RestAdapter.LogLevel.FULL)
RestAdapter.Builder builder = new RestAdapter.Builder()
                    .setLogLevel(RestAdapter.LogLevel.FULL)
                    .setEndpoint(baseUrl)
                    .setClient(new OkClient(new OkHttpClient()));

I'm sure after this you will see in console: 我确定之后您会在控制台中看到:

---> HTTP POST http://10.0.2.2:8000/auth/convert-token
Accept: application/json
Authorization: Bearer facebook <user_access_token>
---> END HTTP (no body)

That means your header is set correctly. 这意味着您的标题设置正确。

"HTTP 405 METHOD NOT ALLOWED" may say that POST method is not expected for this resource. “不允许使用HTTP 405方法”可能表示此资源不希望使用POST方法。 And maybe GET request will help you: 也许GET请求将帮助您:

 @GET("/convert-token")
 User me();

Hi Please Refer githublink and it will give some Idea,let me explain basic functionality here, Create a Interface: 嗨,请参考githublink ,它将给出一些想法,让我在这里解释基本功能,创建接口:

public interface MyApiEndPointInterface {

   /* @GET("contacts/")
    Call<UserPojo> getHiveDetails();*/

    @FormUrlEncoded
    @POST("authorize/")
    Call<SmsLogin> getUser(@Field("username") String username,
                       @Field("password") String password);

    //GetProfile Details
     @GET("getprofile")
    Call<SmsProfilePojo> getProfileDetails(@Header("Authorizations") String myTokenValue);

}

UserProfilePreview.java is An Activity,Please LookUp this Class in repo,It give basic Idea. UserProfilePreview.java是一个活动,请在回购中查找该类,它给出基本的想法。

private void getApiCAll() {

        OkHttpClient okClient = new OkHttpClient.Builder() .addInterceptor(new Interceptor() {
            @Override
            public Response intercept(Chain chain) throws IOException {

                Request request = chain.request().newBuilder()
                        .addHeader("Accept","Application/JSON").build();
                return chain.proceed(request);
            }
        }).build();

         retrofitRef = new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .client(okClient)
                .addConverterFactory(GsonConverterFactory.create())
                .build();


        final MyApiEndPointInterface service = retrofitRef.create(MyApiEndPointInterface.class);
        String myTokenStr = "Bearer "+mToken;
        Call<SmsProfilePojo> call = service.getProfileDetails(myTokenStr);
        call.enqueue(new Callback<SmsProfilePojo>() {
            @Override
            public void onResponse(Call<SmsProfilePojo> call, retrofit2.Response<SmsProfilePojo> response) {
                Log.d(TAG,"OnResponse: "+ response.code());

                if(response.isSuccessful()){

                    SmsProfilePojo result = response.body();
                    mToken = result.getToken();
                    txtVw_Token.setText(mToken);

                }else{
                    Toast.makeText(getApplicationContext(),"Fail in  Response",Toast.LENGTH_SHORT).show();
                }
            }

            @Override
            public void onFailure(Call<SmsProfilePojo> call, Throwable t) {
                Toast.makeText(getApplicationContext(),"Failed",Toast.LENGTH_SHORT).show();

            }
        });


    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM