当前位置: 首页 > 知识库问答 >
问题:

将@Put与改版2和OkHttp3一起使用

长孙智刚
2023-03-14

目前,我使用的是Android改版2.0.0-beta4和OKHTTP3。我正在执行定义如下的@PUT请求:

@Headers({
        Constants.CONTENT_TYPE_HEADER + ": " + Constants.JSON_HEADER_VAL,
        Constants.ACCEPT_HEADER + ": " + Constants.JSON_HEADER_VAL
})
@PUT(Constants.PUT_SKILL_LEVEL)
Call<EmployeeSkill> updateEmpSkillLevel(@Header(Constants.SESSION_COOKIE_NAME) String cookieValue, @Body EmployeeSkillRequest employeeSkillUpdate);

endpoint在这里:http://apps:8080/EmployeeSkillsService/EmployeeSkill。下面是PUT请求的日志输出:

D/OkHttp﹕ --> PUT http://apps:8080/employeeSkillsService/employeeSkill http/1.1
D/OkHttp﹕ Content-Type: application/json;charset=UTF-8
D/OkHttp﹕ Content-Length: 99
D/OkHttp﹕ Accept: application/json
D/OkHttp﹕ JSESSIONID: D147377AB60AFE499D2A1AAF7C93F7A3
D/OkHttp﹕ {"employee":{"id":63},"skill":{"isPrimary":false,"isSecondary":false,"id":3},"skillLevel":{"id":5}}
D/OkHttp﹕ --> END PUT (99-byte body)
<-- 404 Not Found http://apps:8080/employeeSkillsService/app.html (23ms)
D/OkHttp﹕ Server: Apache-Coyote/1.1
D/OkHttp﹕ X-Content-Type-Options: nosniff`D/OkHttp﹕ X-XSS-Protection: 1; mode=block`
D/OkHttp﹕ X-XSS-Protection: 1; mode=block
D/OkHttp﹕ Cache-Control: no-cache, no-store, max-age=0, must-revalidate
D/OkHttp﹕ Pragma: no-cache
D/OkHttp﹕ Expires: 0
D/OkHttp﹕ X-Frame-Options: DENY
D/OkHttp﹕ Content-Type: text/html;charset=utf-8
D/OkHttp﹕ Content-Language: en
D/OkHttp﹕ Content-Length: 1029
D/OkHttp﹕ Date: Mon, 07 Mar 2016 15:39:35 GMT
D/OkHttp﹕ OkHttp-Sent-Millis: 1457365206407
D/OkHttp﹕ OkHttp-Received-Millis: 1457365206412
D/OkHttp﹕ <html><head><title>Apache Tomcat/7.0.52 (Ubuntu) - Error report</title><style><!--H1 
{font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:22px;} H2 
{font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:16px;} H3 
{font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:14px;} BODY {font-family:Tahoma,Arial,sans-serif;color:black;background-color:white;} B{font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;} P {font-family:Tahoma,Arial,sans-serif;background:white;color:black;font-size:12px;}A {color : black;}A.name {color : black;}HR {color : #525D76;}--></style> </head><body><h1>HTTP Status 404 - /employeeSkillsService/app.html</h1><HR size="1" noshade="noshade"><p><b>type</b> Status report</p><p><b>message</b> <u>/employeeSkillsService/app.html</u></p><p><b>description</b> <u>The requested resource is not available.</u></p><HR size="1" noshade="noshade"><h3>Apache Tomcat/7.0.52 (Ubuntu)</h3></body></html>
D/OkHttp﹕ <-- END HTTP (1029-byte body)

我已经在Chrome上的Postman中验证了这个带有这些头和有效负载的endpoint多次工作。然而,当我使用reverfit时,我一直收到一个404错误,尽管endpoint在postman中工作。下面是代码调用:

Call<EmployeeSkill> updateEmployeeSkillCall = RetrofitApiRestClient.getApiClient().updateEmpSkillLevel(cookieValue, employeeSkillUpdate);

updateEmployeeSkillCall.enqueue(new Callback<EmployeeSkill>() {

    @Override
    public void onResponse(Call<EmployeeSkill> call, Response<EmployeeSkill> response) {
        // called when response HTTP status is "200 OK"
        if (response.isSuccess()) {
            holder.spnSkillLevel.setTag(pos);
            Toast.makeText(mContext, holder.tvSkillName.getText() + mContext.getString(R.string.skill_updated_success_text)
                + holder.spnSkillLevel.getSelectedItem().toString(), Toast.LENGTH_LONG).show();

            List<EmployeeSkill> updateEmployeeSkillsRow = EmployeeSkill.find(EmployeeSkill.class, "employee = ? and skill = ?",
                response.body().getEmployee().getId().toString(), response.body().getSkill().getId().toString());

            EmployeeSkill updatedSkill = updateEmployeeSkillsRow.get(0);
            updatedSkill.setSkillLevel(response.body().getSkillLevel());
            updatedSkill.setTimeUpdated(response.body().getSkillLevel().getTimeUpdated());
            updatedSkill.save();
        }
    }

    @Override
    public void onFailure(Call<EmployeeSkill> call, Throwable throwable) {
        Toast.makeText(mContext, holder.tvSkillName.getText() + mContext.getString(R.string.skill_update_failed_text), Toast.LENGTH_LONG).show();
    }
});

我尝试将@body参数更改为JSON字符串,但收到一个错误,说明JSON必须以数组或对象开头。在这件事上的任何帮助都是有用的。没有这个功能,如果我找不到一个解决方案,我将被迫放弃改造,我并不真正期待这样做。

共有1个答案

邵奇
2023-03-14

用Fiddler2解决了我自己的问题。cookie名称和值不正确。邮差可能更宽恕它是如何发送东西,而不是如何改造和其他人这样做。不过,从中学到了一些东西。感谢所有提供协助的人。

 类似资料:
  • 我是Typscript 2的新手。我想做的是在typescript中使用jQuery。在这个问题中,我读到你需要两件事: 这将安装包“@types/jquery 2.0.39”。 然后,在打字稿文件中,我把这个: 但是我收到打字稿错误“找不到模块'jquery'。我做错了什么? 与相同的错误 完整类型脚本文件:

  • 我需要做HTTP删除请求到我的服务器与身体提供。 我以以下方式构建改型对象:

  • 到目前为止,我们已经习惯了tsd或(更好的版本)打字 但是现在 TypeScript 2 提供了新的@types功能,我应该如何将我当前的项目转换为与一起使用? 我有tsd.json(在某些情况下是typings.json)和所有的依赖项,迁移到TypeScript 2的步骤是什么? 有哪些新的最佳实践?@types是否支持特定版本?

  • 问题内容: 我的主页上的所有页面上都有一个函数,我希望它可以通过某些jQuery Ajax方法运行。 我现在有一些这样的代码 jQuery的 母版页中的HTML 我的主VB中的Asp.Net代码 当前,除非我将Web方法移至VB页面,否则此方法不起作用 有什么办法可以改变这部分吗 要使用母版页功能? 我尝试将其更改为 但这只是给我一个404错误 有任何想法吗? 提前致谢 问题答案: 您的网络方法代

  • 我创建了一个新的VS2012项目使用热毛巾模板,作为回报,使用Durandal,淘汰赛和微风。 我想使用jaydata而不是微风,对于ui层,我想使用出色的asKendoDataSource()功能来为kendoui网格供电。 我按照所有的指示,使kendoui工作良好的杜兰达尔。这很好。 我有一个模型,在这个模型中,我获取jaydata实体并在其上运行asKendoDataSource()。“我

  • 我正在尝试学习python、mongodb和flask,我正在使用Miguel Grinberg提供的非常优秀的博客,他在博客上提供了一套很棒的教程。米格尔格林伯格。通用域名格式 我有一个小的RESTful服务器工作正常,但现在想从mongo而不是mysql中提取东西 我可以使用下面的代码拉出mongo记录,但我很难让它呈现出来。 我在下面的代码中使用了箭头来显示我在哪里挣扎,我认为缺乏经验。任何