【问题标题】:How to pass GET parameters to Retrofit request如何将 GET 参数传递给 Retrofit 请求
【发布时间】:2019-08-12 21:33:57
【问题描述】:

我正在使用 SoundCloud api 创建一个应用程序,并尝试附加用户输入的字符串值,但它在界面中显示为 null 我如何在 url 中附加它?

MainActivity.java

  b.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(View p1)
            {
                // TODO: Implement this method
                search = et.getText().toString();
                Log.d("search",search);
                Intent i = new Intent(MainActivity.this, SoundCloud.class);
                i.putExtra("mysearch", search);
                startActivity(i);

                Log.d("CustomUrl",SCService.CustomUrl);
                Toast.makeText(MainActivity.this,""+SCService.CustomUrl,Toast.LENGTH_SHORT).show();


                Retrofit retrofit = new Retrofit.Builder()
                    .baseUrl(Config.API_URL)
                    .addConverterFactory(GsonConverterFactory.create()).build();

                SCService Scservice = retrofit.create(SCService.class);
                Call<Track> call = Scservice.getTrack(search);
                call.enqueue(new Callback<Track>(){

                        @Override
                        public void onResponse(Call<Track> call, Response<Track> response)
                        {
                            // TODO: Implement this method
                            if (response.isSuccessful())
                            {
                                Track track = response.body();
                                streamUrl = track.getStreamUrl();
                                trackname = track.getTitle();
                                Log.e("track", track.getTitle());
                                Toast.makeText(MainActivity.this, trackname, Toast.LENGTH_SHORT).show();
                                Toast.makeText(MainActivity.this, "url" + streamUrl, Toast.LENGTH_SHORT).show();
                                //addToList(trackname);
                            }
                        }

                        @Override
                        public void onFailure(Call<Track> p1, Throwable p2)
                        {
                            // TODO: Implement this method
                            Toast.makeText(MainActivity.this,"error"+p2.getMessage(),Toast.LENGTH_SHORT).show();
                            //showMessage("Network Error: " +  p2.getMessage());
                            Log.d("error", p2.getMessage());
                        }
                    });

            }
        });

ScService.java

public interface SCService
{
    public String CustomUrl = Config.API_URL+"/resolve.json?url="+SoundCloud.SCURL+"&client_id="+Config.CLIENT_ID;
@GET("/resolve.json?url={SCURL}"+"&client_id="+Config.CLIENT_ID)
Call<Track> getTrack(@Path("SCURL")String SCURL);
}       

搜索到的字符串在我的 SoundCloud.java 类中

    SCURL = receivedmsg.getString("mysearch");
    Log.d("intentdata",SCURL);

    tv.setText("Search Results for " + SCURL);  

我想在 GET 参数中附加该 SCURL 字符串,但它显示 SCURL 的值为空,我该如何实现?

更新:我已按上述方式更改了代码,但出现此错误

enter code here
  03-15 13:22:14.866 6149 6149 D     search com.sk.scdoenloader                   /https://m.soundcloud.com/dharmaworldwide/houseofcards-mixmaster-05b
  03-15 13:22:14.967 6149 6149 D     CustomUrl com.sk.scdoenloader                https://api.soundcloud.com/resolve.json?url=null&client_id=iZIs9mchVcX5lhVRyQGGAYlNPVldzAoX
  03-15 13:22:15.299 6149 6149 E     AndroidRuntime com.sk.scdoenloader                   FATAL EXCEPTION: main
  03-15 13:22:15.299 6149 6149 E     AndroidRuntime com.sk.scdoenloader           Process: com.sk.scdoenloader, PID: 6149
  03-15 13:22:15.299 6149 6149 E     AndroidRuntime com.sk.scdoenloader           java.lang.IllegalArgumentException: No Retrofit annotation found. (parameter #1)
  03-15 13:22:15.299 6149 6149 E     AndroidRuntime com.sk.scdoenloader           for method SCService.getTrack
  03-15 13:22:15.299 6149 6149 E     AndroidRuntime com.sk.scdoenloader           at retrofit2.ServiceMethod$Builder.methodError(ServiceMethod.java:720)
  03-15 13:22:15.299 6149 6149 E     AndroidRuntime com.sk.scdoenloader           at retrofit2.ServiceMethod$Builder.methodError(ServiceMethod.java:711)
  03-15 13:22:15.299 6149 6149 E     AndroidRuntime com.sk.scdoenloader           at retrofit2.ServiceMethod$Builder.parameterError(ServiceMethod.java:729)
  03-15 13:22:15.299 6149 6149 E     AndroidRuntime com.sk.scdoenloader                     

【问题讨论】:

  • 可能是您在变量获得值之前使用了它。
  • 你可以使用 Like : @GET("/resolve.json?url={SCURL}") CallgetAllComments(@Path("SCURL")String SCURL);
  • 得到错误没有找到改造注释。 (参数#1)
  • 接收到的消息是什么??在 SCURL = receivedmsg.getString("mysearch");
  • 它是 Bundle 对象,用于从意图中获取字符串 Bundle receivedmsg = getIntent().getExtras();

标签: java android retrofit


【解决方案1】:

你必须在这里使用@Path

@GET("/resolve.json?url={url}&client_id={clientId}")
Call<Track> getTrack(@Path("url") String url,@Path("clientId") String clientId);

【讨论】:

  • 这一个比使用简单字符串连接的另一个答案更好。
  • 收到此错误未找到改造注释。 (参数#1),我已经更新了问题,我在哪里犯了错误?
  • 确保它也属于正确的改造包。就我而言,我不小心从改造而不是改造2中导入了注释
  • 这是我导入的包“import retrofit2.http.Path”
  • 你在用proguard吗?
【解决方案2】:

您可以使用 DYNAMIC URL 进行改造! (与@Get

public interface SCService{  
   @GET
   public Call<Track> getTrack(@Url String url);
}

然后你可以用你的 自定义字符串 url 调用

 service.getTrack("/resolve.json?url="+SoundCloud.SCURL+"&client_id="+ Config.CLIENT_ID + SCURL)

【讨论】:

    【解决方案3】:

    这里你要的是GET参数,不是路径,所以用@Query("scurl") String scurl

    更多详情here

    顺便说一句,变量名全部大写有点奇怪(至少在 Java 中),scurlSCURL 更合适

    【讨论】:

    • 我现在使用了 Asynctask,我的项目已经完成,但是感谢您的回答,下次我会尝试这个,我将 SCURL 设为静态变量,所以将其设为大写 ​​:)
    • 我知道 SCURL 是 SoundCloud 类的静态 final。但是,在Call&lt;Track&gt; getTrack(@Path("SCURL")String SCURL); 方法的上下文中,它是一个普通变量,不应使用所有大写;)
    【解决方案4】:

    你必须在这里使用@Query

     @GET("Account/RegisterMobileNumber")
     Call<JsonObject> sendSMSToMobileNumber(@Query("mobileNumber") String mobileNumber);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-27
      • 2020-02-25
      • 2020-09-11
      • 1970-01-01
      • 1970-01-01
      • 2021-06-26
      • 2016-03-27
      • 1970-01-01
      相关资源
      最近更新 更多