jjzjj

http409 415报错原因

AscendKing 2024-04-21 原文

409

今天一个同事的接口突然报409,大概百度了一下,不是很清楚,谷歌也没找到特别好的解释

因为是直接调用的gitlab,就直接看了下gitlab的api

The following table shows the possible return codes for API requests.

Return valuesDescription
200 OKThe GET, PUT or DELETE request was successful, and the resource itself is returned as JSON.
202 AcceptedThe GET, PUT or DELETE request was successful, and the resource is scheduled for processing.
204 No ContentThe server has successfully fulfilled the request, and there is no additional content to send in the response payload body.
201 CreatedThe POST request was successful, and the resource is returned as JSON.
304 Not ModifiedThe resource hasn't been modified since the last request.
400 Bad RequestA required attribute of the API request is missing. For example, the title of an issue is not given.
401 UnauthorizedThe user isn't authenticated. A valid user token is necessary.
403 ForbiddenThe request isn't allowed. For example, the user isn't allowed to delete a project.
404 Not FoundA resource couldn't be accessed. For example, an ID for a resource couldn't be found.
405 Method Not AllowedThe request isn't supported.
409 ConflictA conflicting resource already exists. For example, creating a project with a name that already exists.
412The request was denied. This can happen if the If-Unmodified-Since header is provided when trying to delete a resource, which was modified in between.
422 UnprocessableThe entity couldn't be processed.
429 Too Many RequestsThe user exceeded the application rate limits.
500 Server ErrorWhile handling the request, something went wrong on the server.

gitlab解释的很清晰,就是说资源已经存在了,再次创建失败

那为什么接口没有将报错message展示出来,查了一下代码是因为直接屏蔽了409状态码,直接用postman访问接口会返回具体错误信息,错误提示信息示例:

示例1:

{

    "message": "Email has already been taken"

}

示例2:

{

    "message": "Username has already been taken"

}

找gitlab负责人查了下数据,确实是用户已经存在了,但是用户状态是blocked(禁用),问题解决

-----------------------------------我是分割线-----------------------------------

415

        好巧不巧,今天又一个项目遇到了一个奇怪的错误码415,平时开发不常见,让我去帮忙排查

        先简单了解了一下,服务A直接通过postman调用是可以的,但是就是别的服务调用服务A响应415,先百度,直接说是请求头不支持导致的

        查看postman请求头,Content-Type是application/json;改下请求头(直接取消传递Content-Type,默认),响应415,具体响应内容如下

{

    "timestamp": "2023-02-14T09:55:54.342+0000",

    "status": 415,

    "error": "Unsupported Media Type",

    "message": "Content type 'application/octet-stream' not supported",

    "path": "/zhanye-admin/iam/sync/SchemaService"

}

改成text/plain,则响应还是415,具体响应

{

    "timestamp": "2023-02-14T09:58:07.376+0000",

    "status": 415,

    "error": "Unsupported Media Type",

    "message": "Content type 'text/plain;charset=UTF-8' not supported",

    "path": "/zhanye-admin/iam/sync/SchemaService"

}

基本能确定是调用方请求头的问题,但是调用方说自己调用没问题,调用服务A跟调用别的系统都一样,别的服务都正常,就是服务A一直报错,服务A的开发同学也很委屈,我postman调用正常...

        那就直接curl调用一下试试吧,直接在B服务所在的服务器调用A服务,正常,ok,这就确定了是B服务调用的问题,直接将调用请求和响应截图给B服务开发同学,让他排查问题,最终发现B服务的请求头中Content-Type不是application/json,而是text/plain

有关http409 415报错原因的更多相关文章

  1. ruby - 如何模拟 Net::HTTP::Post? - 2

    是的,我知道最好使用webmock,但我想知道如何在RSpec中模拟此方法:defmethod_to_testurl=URI.parseurireq=Net::HTTP::Post.newurl.pathres=Net::HTTP.start(url.host,url.port)do|http|http.requestreq,foo:1endresend这是RSpec:let(:uri){'http://example.com'}specify'HTTPcall'dohttp=mock:httpNet::HTTP.stub!(:start).and_yieldhttphttp.shou

  2. ruby - Net::HTTP 获取源代码和状态 - 2

    我目前正在使用以下方法获取页面的源代码:Net::HTTP.get(URI.parse(page.url))我还想获取HTTP状态,而无需发出第二个请求。有没有办法用另一种方法做到这一点?我一直在查看文档,但似乎找不到我要找的东西。 最佳答案 在我看来,除非您需要一些真正的低级访问或控制,否则最好使用Ruby的内置Open::URI模块:require'open-uri'io=open('http://www.example.org/')#=>#body=io.read[0,50]#=>"["200","OK"]io.base_ur

  3. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  4. 深度学习部署:Windows安装pycocotools报错解决方法 - 2

    深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal

  5. ruby-on-rails - Rails - 从命名路由中提取 HTTP 动词 - 2

    Rails中有没有一种方法可以提取与路由关联的HTTP动词?例如,给定这样的路线:将“users”匹配到:“users#show”,通过:[:get,:post]我能实现这样的目标吗?users_path.respond_to?(:get)(显然#respond_to不是正确的方法)我最接近的是通过执行以下操作,但它似乎并不令人满意。Rails.application.routes.routes.named_routes["users"].constraints[:request_method]#=>/^GET$/对于上下文,我有一个设置cookie然后执行redirect_to:ba

  6. ruby-on-rails - Heroku 吃掉了我的自定义 HTTP header - 2

    我正在使用Heroku(heroku.com)来部署我的Rails应用程序,并且正在构建一个iPhone客户端来与之交互。我的目的是将手机的唯一设备标识符作为HTTPheader传递给应用程序以进行身份​​验证。当我在本地测试时,我的header通过得很好,但在Heroku上它似乎去掉了我的自定义header。我用ruby​​脚本验证:url=URI.parse('http://#{myapp}.heroku.com/')#url=URI.parse('http://localhost:3000/')req=Net::HTTP::Post.new(url.path)#boguspara

  7. ruby-on-rails - 使用 HTTP.get_response 检索 Facebook 访问 token 时出现 Rails EOF 错误 - 2

    我试图在我的网站上实现使用Facebook登录功能,但在尝试从Facebook取回访问token时遇到障碍。这是我的代码:ifparams[:error_reason]=="user_denied"thenflash[:error]="TologinwithFacebook,youmustclick'Allow'toletthesiteaccessyourinformation"redirect_to:loginelsifparams[:code]thentoken_uri=URI.parse("https://graph.facebook.com/oauth/access_token

  8. ruby - HTTP 请求中的用户代理,Ruby - 2

    我是Ruby的新手。我试过查看在线文档,但没有找到任何有效的方法。我想在以下HTTP请求botget_response()和get()中包含一个用户代理。有人可以指出我正确的方向吗?#PreliminarycheckthatProggitisupcheck=Net::HTTP.get_response(URI.parse(proggit_url))ifcheck.code!="200"puts"ErrorcontactingProggit"returnend#Attempttogetthejsonresponse=Net::HTTP.get(URI.parse(proggit_url)

  9. ruby - 如何使用 Ruby HTTP::Net 处理 404 错误? - 2

    我正在尝试解析网页,但有时会收到404错误。这是我用来获取网页的代码:result=Net::HTTP::getURI.parse(URI.escape(url))如何测试result是否为404错误代码? 最佳答案 像这样重写你的代码:uri=URI.parse(url)result=Net::HTTP.start(uri.host,uri.port){|http|http.get(uri.path)}putsresult.codeputsresult.body这将打印状态码和正文。

  10. ruby - 让 bundler 使用 http : instead of git:? - 2

    我正在安装gitlabhq,并且在Gemfile中有对某些资源的“git://...”的引用。但是,我在公司防火墙后面,所以我必须使用http://。我可以手动编辑Gemfile,但我想知道是否有另一种方法告诉bundler使用http://作为git存储库? 最佳答案 您可以通过运行gitconfig--globalurl."https://".insteadOfgit://或通过将以下内容添加到~/.gitconfig:[url"https://"]insteadOf=git://

随机推荐