SAP Business One Service Layer登录返回-304空错误码求助
我来帮你拆解下这两个登录错误的原因和对应的解决办法:
错误码102:Invalid login credential
这个错误的核心原因很明确——你用了错误的字段名。SAP Business One Service Layer的登录接口要求的字段是**UserName**(注意首字母大写,且Name的N也是大写),而你第二次请求里写的是Username(小写的n),接口识别不了这个字段,就会判定为无效凭证。
另外也顺带确认下:
- 你的用户名、密码是否确实正确,有没有大小写错误
CompanyDB的名称是否和SAP B1里的数据库名称完全一致(部分环境下数据库名是区分大小写的)
错误码-304:空错误消息
这个错误比较隐晦,没有明确提示,常见的几个排查方向:
1. 缺少Content-Type请求头
Service Layer要求登录请求的Content-Type必须设为application/json,否则它无法正确解析你发送的JSON payload,就会返回这个无消息的-304错误。
- Postman里:在「Headers」标签下添加键值对
Content-Type: application/json - Python requests里:请求时要带上这个header,示例见下文
2. API端点路径不完整
你可能请求了错误的接口路径,Service Layer的登录接口完整路径应该是http(s)://<你的B1服务器地址>:<端口>/b1s/v1/Login,比如默认HTTP端口是50000,HTTPS是50001。直接请求/Login是找不到正确接口的。
3. 网络/缓存问题
虽然POST请求一般不会被缓存,但如果你的请求经过了代理服务器,可能会出现异常缓存导致的304错误。可以试试清除Postman的缓存,或者直接绕过代理访问Service Layer。
4. 用户权限不足
检查你的SAP B1账号是否被授予了Service Layer的访问权限:在SAP B1客户端中,找到该用户,给它分配「Service Layer」相关的权限组(比如内置的「Service Layer」权限)。
正确的登录请求示例
Postman配置
- 请求方法:选择
POST - 请求URL:
https://your-b1-server:50001/b1s/v1/Login - Headers:添加
Content-Type: application/json - Body:选择「raw」→ 格式选「JSON」,输入:
{"UserName":"my_username","Password":"my_password","CompanyDB":"NAME_OF_MY_DB"}
Python requests代码
import requests # 替换成你的服务器地址、端口和凭证 service_layer_url = "https://your-b1-server:50001/b1s/v1/Login" login_payload = { "UserName": "my_username", "Password": "my_password", "CompanyDB": "NAME_OF_MY_DB" } headers = {"Content-Type": "application/json"} # 如果是自签名HTTPS证书,添加verify=False(生产环境不建议) response = requests.post(service_layer_url, json=login_payload, headers=headers, verify=False) print("登录响应:", response.json())
登录成功后,你会收到包含SessionId和SessionTimeout的响应。之后访问Items等接口时,需要在请求头里带上SessionId: <你的会话ID>,或者通过Cookie传递B1SESSION=<SessionId>。
内容的提问来源于stack exchange,提问作者neisor

