【问题标题】:Retrofit: Only @Query is working but @Field is not working改造:只有@Query 工作,但@Field 不工作
【发布时间】:2019-12-17 21:04:04
【问题描述】:

我尝试使用@Field@Body@POST 插入数据,但它生成"500 internal server error" 和我尝试使用@GET@Query 的相同代码然后它工作正常并且数据插入成功。

那么有什么方法可以使用@Body 或@Field 使用Web 服务Web 方法将数据插入我的asp.net 网站。

Using @Body


 @POST("/EducationApi.asmx/addEducationAPI")
    public void addEducation(@Body Education education, Callback<Education> callback);
'''

Using @Field

'''
@FormUrlEncoded
    @POST("/EducationApi.asmx/insertEducationAPI/")
    public void insertEducationDetail(@Field("user_id") int user_id, @Field("degree_name") String degree_name, @Field("institute_name") String institute_name, @Field("board_university_name") String board_university_name, @Field("year_of_passing") int year_of_passing, @Field("percentage_cgpa") float percentage_cgpa, @Field("specialization") String specialization, Callback<Education> callback);


using @Query (This works proper)


@GET("/EducationApi.asmx/insertEducationAPI")
    public void insertEducation(@Query("user_id") int user_id,@Query("degree_name") String degree_name, @Query("institute_name") String institute_name, @Query("board_university_name") String board_university_name,@Query("year_of_passing") int year_of_passing,@Query("percentage_cgpa") float percentage_cgpa,@Query("specialization") String specialization, Callback<Education> callback);

我想使用@Post 将记录插入到我的数据库中

【问题讨论】:

  • /EducationApi.asmx/insertEducationAPI/ 结尾应该有斜线吗?
  • 您可以使用邮递员向 API 发帖吗?
  • 在邮递员中,@Field 也会出现 500 内部服务器错误
  • 是的,斜线是他们的

标签: android asp.net web-services annotations retrofit


【解决方案1】:
@FormUrlEncoded
@POST("/EducationApi.asmx/insertEducationAPI/")
public void insertEducationDetail(@Field("user_id") int user_id, @Field("degree_name") String degree_name, @Field("institute_name") String institute_name, @Field("board_university_name") String board_university_name, @Field("year_of_passing") int year_of_passing, @Field("percentage_cgpa") float percentage_cgpa, @Field("specialization") String specialization, Callback<Education> callback);

我在上面的代码中犯了一个愚蠢的错误。这就是为什么它不起作用所以将上面的代码更改为下面的代码

@FormUrlEncoded
@POST("/EducationApi.asmx/insertEducationAPI")
public void insertEducationDetail(@Field("user_id") int user_id, @Field("degree_name") String degree_name, @Field("institute_name") String institute_name, @Field("board_university_name") String board_university_name, @Field("year_of_passing") int year_of_passing, @Field("percentage_cgpa") float percentage_cgpa, @Field("specialization") String specialization, Callback<Education> callback);

【讨论】:

    【解决方案2】:

    是的,可以使用正文发送数据。正文内部您可以根据自己的选择发送@Field 和@query 或多部分数据。

    参见下面的代码,我在这里创建了 On Class,它合并了 @Field 和 Multi-part 数据以进行图像上传,并通过 Body 发送所有这些数据。

    public void addConactList(String name, String vessel, String email, String phone, String country, String note, String selectedfilename, ByteArrayOutputStream bos, String bvalue, String pvalue, String intrested) {
        RetroFitService retroFitService = RetrofitClient.getSalesLead();
    
        MultipartBody.Builder builder = new MultipartBody.Builder().setType(MultipartBody.FORM);
    
        builder.addFormDataPart(Const.Name, name)
                .addFormDataPart(Const.Vessel, vessel)
                .addFormDataPart(Const.Email, email)
                .addFormDataPart(Const.Phone, phone)
                .addFormDataPart(Const.Country, country)
                .addFormDataPart(Const.Notes, note)
                .addFormDataPart(Const.Photo, selectedfilename, RequestBody.create(MultipartBody.FORM, bos.toByteArray()))
                .addFormDataPart(Const.Business, bvalue)
                .addFormDataPart(Const.Probability, pvalue)
                .addFormDataPart(Const.Interest, intrested);
    
    
        RequestBody requestBody = builder.build();
    
        try {
    
            Call<ContactResponse> call = retroFitService.addCountryList(requestBody);
            call.enqueue(new Callback<ContactResponse>() {
                @Override
                public void onResponse(Call<ContactResponse> call, Response<ContactResponse> response) {
                    ContactResponse msg = response.body();
                    Log.e(TAG, "onResponse: " + msg.toString());
                    listener.onAddContact();
                }
    
                @Override
                public void onFailure(Call<ContactResponse> call, Throwable t) {
                    Log.e(TAG, "onFailure: " + t.toString());
                    listener.onAddContact();
                }
            });
    
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    

    然后在我使用以下代码从我的活动中调用此类文件方法之后。

    new AddContactDetails(context, this).addConactList(name, vessel, email, phone, country, note, selectedFileName, bos, bvalue, pvalue, intrested);
    

    您必须像下面的代码一样在改造服务类中发布正文方法。

     @POST(Const.Add_Contact)
    Call<ContactResponse> addCountryList(@Body RequestBody file);
    

    【讨论】:

    • @POST(Const.Add_Contact)------- 这行是什么意思,还请告诉我你的 web 方法(ASP.NET weeb 服务)和 RequestBody 类(Android)代码已写信寻求帮助。
    • Const.Add_Contact 是一个存储我的 api 文件名的变量。你可以简单地写@Post("Your Api File Name")
    • 请您添加web服务代码(asp.net端)
    猜你喜欢
    • 2016-12-13
    • 1970-01-01
    • 1970-01-01
    • 2017-08-24
    • 2021-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多